要清空数据库表,我使用此SQL查询:
TRUNCATE TABLE `books`
如何使用Django的模型和ORM截断表?
我试过这个,但它不起作用:
Book.objects.truncate()
答案 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中的所有数据都将被删除!
答案 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
命令。因此,自动化命令行可能会处理这种极端情况。
可能会在某个时候拯救别人......