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也会追逐外键引用并删除其他表中的对象.
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)
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)
重要提示:这对于继承的模型不起作用,因为它们跨越多个表!
除了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删除除了后五个查询集之外的所有内容 ".
我添加了这个,同时意识到答案已经得到了解答,但希望这一补充将有助于其他人.
我知道这是一个非常古老的问题,这里也有几个正确的答案,但我无法抗拒自己分享最优雅和最快的方法来达到这个问题的目的。
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)
| 归档时间: |
|
| 查看次数: |
32172 次 |
| 最近记录: |