Django с использованием bulk_update для обновления всех записей - PullRequest
0 голосов
/ 05 апреля 2020

С 2.2 у нас теперь есть возможность массового обновления: https://docs.djangoproject.com/en/3.0/ref/models/querysets/#bulk -update

У меня есть модель, скажем, с миллионами строк, и я хочу эффективно обновить все записи. Я пытаюсь использовать bulk_update, но это означает, что мне все равно нужно загрузить все объекты модели в памяти, изменить поле одно за другим, а затем использовать массовое обновление:

Что я делаю:

def migrate_event_ip_to_property(apps, schema_editor):
    Event = apps.get_model('app' 'Event')
    events = Event.objects.all()

    for event in events:
        if event.ip:
            event.properties["$ip"] = event.ip

    Event.objects.bulk_update(events, ['properties'], 10000)

Поскольку существуют миллионы записей, могу ли я избежать выполнения Event.objects.all () и загружать все объекты в память даже при использовании bulk_update?

Ответы [ 2 ]

1 голос
/ 05 апреля 2020
def migrate_event_ip_to_property(apps, schema_editor):
    Event = apps.get_model('app' 'Event')
    chunk = []
    # Use iterator to save memory
    for i, event in enumerate(Event.objects.only('properties', 'ip').iterator(chunk_size=10000)):
        if event.ip:
            event.properties['$ip'] = event.ip
            chunk.append(event)
        # Every 10000 events run bulk_update
        if i % 10000 == 0 and chunk:
            Event.objects.bulk_update(chunk, ['properties'])
            chunk = []
    if chunk:
        Event.objects.bulk_update(chunk, ['properties'])
0 голосов
/ 05 апреля 2020

Если память - ваша главная задача, как насчет ограничения полей, которые вы загружаете в память:

Event.objects.all().values('id','properties')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...