我将 Django 1.11 与 MySQL 一起使用。在短期内升级到 2 是不可行的,因此对于我当前的问题不是一个可接受的解决方案,但是提到 Django 2 的答案可能会帮助其他人,所以请随时发布它们。
我需要对表中的所有行执行数据迁移。行数少于 40000,但它们非常大 - 其中两列是 ~15KB 的 JSON,在加载模型时会被解析。(这些是我需要在数据迁移中使用的行,所以我不能推迟它们)
为了不将所有对象同时加载到内存中,我想我会使用queryset.iterator一次只解析第 100 行。如果我所做的只是读取结果,这很好用,但是如果我执行另一个查询(例如,对save
其中一个对象),那么一旦我到达当前 100 个结果块的末尾,就不会获取下一个 100 个结果块并且迭代器完成。
就好像fetchmany 从中获取行的结果集已经丢失了。
为了说明使用场景./manage.py shell
(假设存在 40000 个具有顺序 id 的 MyModel)
iterator = app.models.MyModel.objects.iterator()
for obj in iterator:
print(obj.id)
上面按预期打印了 1 到 40000 的 ID。
iterator = app.models.MyModel.objects.iterator()
for obj in iterator:
print(obj.id)
obj.save()
以上仅打印 ids 1 到 100
iterator = app.models.MyModel.objects.iterator()
for obj in iterator:
print(obj.id)
if obj.id == 101:
obj.save()
以上仅打印 ids 1 到 200
obj.save
用任何其他对数据库进行查询的东西(例如)替换具有app.models.OtherModel.objects.first()
相同的结果。
使用查询集迭代器时根本不可能进行另一个查询吗?有没有另一种方法来实现同样的目标?
谢谢