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

标签 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)
..
..

现在,如果我通过某种方式将所有这些查询集组合成一个查询集
del = a + b + c +d ......
我做
del.delete()
那么它会在更短的时间内删除所有行还是会再次重新处理查询以删除它们并且需要时间?

最佳答案

查询集是 lazy-evaluated所以这不会有性能提升效果。但是,如果你想减少内存消耗,那么你可以使用 (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 )
  • 您的模型没有要处理的信号
  • 关于django - 如何从django中的db中获取数据 block 然后删除它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60736901/

    相关文章:

    django - 在django中保存后对象的id为none

    python - Django,在对象循环中获取相关对象

    django - 如何强制 select_related() 选择具有 null=True 属性的外键?

    sql - 如何按降序选择id刚好大于x的行

    postgresql - PostgreSQL 中的校验和字段到内容比较

    java - 玩!框架 2.7 - 无法连接到数据库

    django - 如何使用 docker 部署 django-q Worker?

    python - 重写 haystack build_page() 函数

    django - 如何在Elasticsearch中运行查询和过滤器的组合?

    django rest 框架不接受 blob 图片文件(不允许文件扩展名 “”)