如何从 Django 中的数据库中获取块中的数据然后删除它们?
how to fetch data in chunks from db in django and then delete them?
我的基本问题陈述是,我想从具有 100 万行的 table 中获取每一行,但一次只能分块获取 2000 行。在评估这些分块查询后,我想删除每一行。
所以就说我有
a = Model.objects.filter(id=1<2000)
b = Model.objects.filter(id=2000<4000)
c = Model.objects.filter(id=4000<6000)
..
..
现在如果我通过某种方式将所有这些查询集组合成一个查询集
del = a + b + c +d ......
我也是
del.delete()
那么它会在更短的时间内删除所有行,还是会再次重新处理查询以删除它们并且需要时间?
查询集是 lazy-evaluated so this will have no performance boost effect. But, ff you want to decrease memory consumption, then you can use (iterator)[https://docs.djangoproject.com/en/3.0/ref/models/querysets/#iterator],参数集 chunk_size:
for record in Model.objects.all().iterator(chunk_size=2000):
record.delete()
否则,如果你真的想提高删除速度,那么你可以尝试使用未记录的方法_raw_delete
a = Model.objects.all()
a._raw_delete(a.db)
仅当:
- 您的模型没有级联删除(例如与此模型相关的外键
on_delete=CASCADE
)
- 您的模型没有要处理的信号
我的基本问题陈述是,我想从具有 100 万行的 table 中获取每一行,但一次只能分块获取 2000 行。在评估这些分块查询后,我想删除每一行。
所以就说我有
a = Model.objects.filter(id=1<2000)
b = Model.objects.filter(id=2000<4000)
c = Model.objects.filter(id=4000<6000)
..
..
现在如果我通过某种方式将所有这些查询集组合成一个查询集
del = a + b + c +d ......
我也是
del.delete()
那么它会在更短的时间内删除所有行,还是会再次重新处理查询以删除它们并且需要时间?
查询集是 lazy-evaluated so this will have no performance boost effect. But, ff you want to decrease memory consumption, then you can use (iterator)[https://docs.djangoproject.com/en/3.0/ref/models/querysets/#iterator],参数集 chunk_size:
for record in Model.objects.all().iterator(chunk_size=2000):
record.delete()
否则,如果你真的想提高删除速度,那么你可以尝试使用未记录的方法_raw_delete
a = Model.objects.all()
a._raw_delete(a.db)
仅当:
- 您的模型没有级联删除(例如与此模型相关的外键
on_delete=CASCADE
) - 您的模型没有要处理的信号