web-dev-qa-db-ja.com

DjangoのORMを使用してテーブルを切り捨てる方法は?

データベーステーブルを空にするには、次のSQLクエリを使用します。

TRUNCATE TABLE `books`

DjangoのモデルとORMを使用してテーブルを切り捨てる方法は?

私はこれを試しましたが、うまくいきません:

Book.objects.truncate()
45
Silver Light

ORMで最も近いものはBook.objects.all().delete()です。

ただし、違いがあります。切り捨てが高速になる可能性がありますが、ORMは外部キー参照を追跡し、他のテーブルのオブジェクトを削除します。

59
Ned Batchelder

これは高速で軽量な方法で行えますが、DjangoのORMは使用しません。 Django接続カーソルで生のSQLを実行できます。

from Django.db import connection
cursor = connection.cursor()
cursor.execute("TRUNCATE TABLE `books`")
31
Shamanu4

モデルの_metaプロパティを使用して、データベーステーブル名を入力できます。

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

重要:継承されたモデルは複数のテーブルにまたがっているため、これは機能しません!

24
Brendan Annable

Ned Batchelderの回答に加えて、Bernhard Kircherのコメントを参照:

私の場合、webappを使用して非常に大きなデータベースを空にする必要がありました。

Book.objects.all().delete()

開発SQLlite環境で返されたもの:

too many SQL variables

そこで、少しの回避策を追加しました。おそらく最も近いものではありませんが、少なくとも、テーブルの切り捨てオプションが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の最後の5つを除くすべてを削除 」に基づいていました。

回答が既に回答されていることを認識しながらこれを追加しましたが、この追加が他の人の助けになることを願っています。

8
michel.iamit

これで、Djangoプロジェクトデータベース、 Django-truncate と呼ばれる)の特定のテーブルを切り捨てるのに役立つライブラリがあります。

python manage.py truncate --apps myapp --models Model1を実行するだけで簡単です。そのテーブルのすべてのデータが削除されます!

詳細についてはこちらをご覧ください: https://github.com/KhaledElAnsari/Django-truncate

0