首页 > 解决方案 > Django 使用 bulk_update 更新所有记录

问题描述

对于 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)

由于有数百万条记录,即使在使用 bulk_update 时,我是否可以避免执行 Event.objects.all() 并将所有对象加载到内存中?

标签: djangodjango-models

解决方案


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'])

推荐阅读