Django表TRUNCATE基于DB类型的视图

时间:2013-03-30 20:18:46

标签: django

根据视图中的数据库类型截断Django ORM中的表的最快方法是什么?我知道你可以这样做,例如

Books.objects.all().delete()

但是包含数百万行的表格非常慢。我知道也可以使用游标和一些自定义SQL

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

但是,TRUNCATE命令不适用于SQLite。如果数据库移动到另一个数据库类型,我需要考虑到这一点。

有什么想法吗?在我的视图中删除表并重新创建会更容易吗?

1 个答案:

答案 0 :(得分:2)

Django的.delete()方法确实非常慢,因为它加载了每个被删除对象的ID,因此可以发出post_save信号。

这意味着简单的connection.execute("DELTE FROM foo")将明显快于Foo.objects.delete()

如果仍然太慢,截断或丢弃+重新创建绝对是可行的方法。您可以获取用于创建表格的SQL:output, references = connection.creation.sql_create_model(model, style),其中style = django.core.management.color_style()(取自https://github.com/django/django/blob/master/django/core/management/sql.py#L14)。