如何使用Django的ORM TRUNCATE TABLE?

时间:2010-06-07 11:24:57

标签: python sql django

要清空数据库表,我使用此SQL查询:

TRUNCATE TABLE `books`

如何使用Django的模型和ORM截断表?

我试过这个,但它不起作用:

Book.objects.truncate()

8 个答案:

答案 0 :(得分:58)

您与ORM最接近的是Book.objects.all().delete()

虽然存在差异:truncate可能会更快,但ORM也会追逐外键引用并删除其他表中的对象。

答案 1 :(得分:31)

您可以快速轻巧地完成此操作,但不能使用Django的ORM。您可以使用Django连接游标执行原始SQL:

from django.db import connection
cursor = connection.cursor()
cursor.execute("TRUNCATE TABLE `books`")

答案 2 :(得分:24)

您可以使用模型的_meta属性填写数据库表名称:

from django.db import connection
cursor = connection.cursor()
cursor.execute('TRUNCATE TABLE "{0}"'.format(MyModel._meta.db_table))

重要:这对于继承的模型不起作用,因为它们跨越多个表格!

答案 3 :(得分:8)

除了Ned Batchelder的回答并参考Bernhard Kircher的评论:

在我的情况下,我需要使用webapp清空一个非常大的数据库:

Book.objects.all().delete()

在开发SQLlite环境中,返回了:

too many SQL variables

所以我添加了一些解决方法。它可能不是最好的,但至少它可以工作,直到truncate table选项构建到Django的ORM中:

countdata = Book.objects.all().count()
logger.debug("Before deleting: %s data records" % countdata)
while countdata > 0:
    if countdata > 999:
        objects_to_keep = Book.objects.all()[999:]
        Book.objects.all().exclude(pk__in=objects_to_keep).delete()
        countdata = Book.objects.all().count()
    else:
        Book.objects.all().delete()
        countdata = Book.objects.all().count()

顺便说一下,我的一些代码基于“Django Delete all but last five of queryset”。

我添加了这个,同时意识到答案已经得到解答,但希望这一补充能够帮助其他人。

答案 4 :(得分:0)

现在有一个库可以帮助您截断Django项目数据库中的特定TABLE,它名为django-truncate

只需运行python manage.py truncate --apps myapp --models Model1就可以了,该TABLE中的所有数据都将被删除!

点击此处了解详情:https://github.com/KhaledElAnsari/django-truncate

答案 5 :(得分:0)

我知道这是一个非常老的问题,这里也没有几个正确的答案,但是我无法抗拒分享最优雅,最快的方式来解决这个问题。

class Book(models.Model):
    # Your Model Declaration

    @classmethod
    def truncate(cls):
        with connection.cursor() as cursor:
            cursor.execute('TRUNCATE TABLE {} CASCADE'.format(cls._meta.db_table))

现在要截断Book表中的所有数据,只需调用

Book.truncate()

由于这是直接与您的数据库进行交互的,因此它的执行速度将比这样做快得多

Book.objects.all().delete()

答案 6 :(得分:0)

对我来说,要截断我的本地sqllite数据库,我会得到python manage.py flush

我最初尝试的是遍历模型并将所有内容一一删除:

models = [m for c in apps.get_app_configs() for m in c.get_models(include_auto_created=False)]

        for m in models:
            m.objects.all().delete()

但是因为我已经保护了外键,所以操作的成功取决于模型的顺序。

因此,我正在使用te flush命令截断本地测试数据库,并且该数据库对我有用 https://docs.djangoproject.com/en/3.0/ref/django-admin/#django-admin-flush

答案 7 :(得分:-2)

这不是直接回答OP的问题,但仍然可以用来实现相同的解决方案 - 不同。


好吧,出于一些奇怪的原因(尝试在其他答案中使用建议的RAW方法),我没有截断我的Django数据库缓存表,直到我做了这样的事情:

import commands
cmd = ['psql', DATABASE, 'postgres', '-c', '"TRUNCATE %s;"' % TABLE]
commands.getstatusoutput(' '.join(cmd))

基本上,在这种情况下,由于使用Postgres,我不得不通过数据库的实用程序命令truncate发出psql命令。因此,自动化命令行可能会处理这种极端情况。

可能会在某个时候拯救别人......