如何从django中的db中获取数据块然后删除它们?

cod*_*iot 3 django postgresql django-models django-orm

我的基本问题陈述是,我想从具有 100 万行的表中一次只提取 2000 行的每一行。在评估这些分块查询后,我想删除每一行。

所以就说我有

a = Model.objects.filter(id=1<2000)
b = Model.objects.filter(id=2000<4000)
c = Model.objects.filter(id=4000<6000)
..
..
Run Code Online (Sandbox Code Playgroud)

现在,如果我通过某种方式将所有这些查询集组合成一个查询集

del = a + b + c +d ......

我做

del.delete()

那么它会在更短的时间内删除所有行还是会再次重新处理查询以删除它们并且需要时间?

Cha*_*nel 6

查询集是惰性评估的,因此这不会有性能提升效果。但是,如果你想减少内存消耗,那么你可以使用 (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()
Run Code Online (Sandbox Code Playgroud)

否则,如果您实际上是在寻找提高删除速度,那么您可以尝试使用未公开的方法_raw_delete

a = Model.objects.all()
a._raw_delete(a.db)
Run Code Online (Sandbox Code Playgroud)

除非:

  1. 您的模型没有级联删除(例如与此模型相关的外键on_delete=CASCADE
  2. 您的模型没有要处理的信号