如何使用Django的ORM TRUNCATE TABLE?

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

TRUNCATE TABLE `books` 

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

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

 Book.objects.truncate() 

使用ORM得到的最接近的是Book.objects.all().delete()

虽然有区别:truncate可能会更快,但ORM也将追逐外键引用和删除其他表中的对象。

你可以用快速和轻量级的方式做到这一点,但不能使用Django的ORM。 您可以使用Django连接游标执行原始SQL:

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

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

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

重要提示 :这不适用于inheritance模型,因为它们跨越多个表格!

除了Ned Batchelder的回答,还提到Bernhard Kircher的评论:

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

 Book.objects.all().delete() 

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

 too many SQL variables 

所以我加了一点解决办法。 它可能不是最好的,但至less它的工作,直到截断表选项构build到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删除所有,但最后五个queryset ”。

我知道这个答案已经回答了,但是希望这个补充会帮助其他人。

现在有一个库可以帮助你在Django项目数据库中截断一个特定的TABLE,它叫做django-truncate 。

这很简单,只需运行python manage.py truncate --apps myapp --models Model1 ,该表中的所有数据都将被删除!

在这里了解更多信息: https : //github.com/KhaledElAnsari/django-truncate

这不是直接回答OP的问题,而是一个可以用来实现同样的事情的解决scheme – 不同的。


那么,由于一些奇怪的原因(当试图在其他答案中使用build议的RAW方法),我没有截断我的Django数据库caching表,直到我做了这样的事情:

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

基本上,我不得不通过数据库的实用程序命令发出truncate命令 – psql ,因为我使用的是Postgres。 所以,自动化命令行可能会处理这种情况。

也许可以节省别人一些时间…