django - 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() 并将所有对象加载到内存中?
解决方案
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'])
推荐阅读
- php - 在 Laravel 中检索没有 html 标签的数据
- node.js - 如何从 NodeJS 中的 .cer 和 .key 获取 .pfx 文件?
- delphi - 如何在 IDE 的表单设计器中锁定表单大小句柄?
- excel - 分析公式树以合并公式
- sql-server - 无法连接到 SSAS 表格中的另一个连接
- sql - 选择每月最近的考试成绩
- angular - 如何创建一个 npm 包,该包将能够使用它导入到的任何项目的环境文件中的 baseUrl?
- arrays - VHDL 问题:数组形状不匹配 - 没有匹配元素
- python - 检查密钥不存在
- javascript - 如何在 ReactJS 中设置向“onchange”添加两个函数