如何使用Django的ORM TRUNCATE TABLE?

Sil*_*ght 49 python sql django

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

TRUNCATE TABLE `books`
Run Code Online (Sandbox Code Playgroud)

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

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

Book.objects.truncate()
Run Code Online (Sandbox Code Playgroud)

Ned*_*der 61

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

但是有一些区别:truncate可能会更快,但ORM也会追逐外键引用并删除其他表中的对象.

  • 这似乎不适用于每个数据库后端 - 当我在一个表上尝试上面的sqlite3大约3000条记录时,我得到了一个DatabaseError"太多的SQL变量".也许我只缺少批处理/ sqlite的配置值. (4认同)
  • 在MySQL中,它也是DELETE而不是TRUNCATE.没有使用DELETE重置索引. (2认同)

Sha*_*nu4 32

你可以快速轻巧地完成这项工作,但不能使用Django的ORM.您可以使用Django连接游标执行原始SQL:

from django.db import connection
cursor = connection.cursor()
cursor.execute("TRUNCATE TABLE `books`")
Run Code Online (Sandbox Code Playgroud)

  • TRUNCATE TABLE是"典型"SQL语法的一部分,尽管只是正式的SQL语句的一部分:2008.Django支持Postgres,MySQL,SQLite*和Oracle.http://www.postgresql.org/docs/8.1/interactive/sql-truncate.html http://dev.mysql.com/doc/refman/4.1/en/truncate-table.html http:// download. oracle.com/docs/cd/B19306_01/server.102/b14200/statements_10006.htm*SQLite缺少TRUNCATE [TABLE]支持,你需要使用DELETE FROM.当然,这实际上只适用于需要性能的情况. (7认同)

Bre*_*ble 24

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

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

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


mic*_*mit 8

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

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

Book.objects.all().delete()
Run Code Online (Sandbox Code Playgroud)

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

too many SQL variables
Run Code Online (Sandbox Code Playgroud)

所以我添加了一些解决方法.它可能不是最好的,但至少它可以工作,直到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()
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我的一些代码基于" Django删除除了后五个查询集之外的所有内容 ".

我添加了这个,同时意识到答案已经得到了解答,但希望这一补充将有助于其他人.


Shu*_*aha 6

我知道这是一个非常古老的问题,这里也有几个正确的答案,但我无法抗拒自己分享最优雅和最快的方法来达到这个问题的目的。

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))
Run Code Online (Sandbox Code Playgroud)

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

Book.truncate()
Run Code Online (Sandbox Code Playgroud)

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

Book.objects.all().delete()
Run Code Online (Sandbox Code Playgroud)