Подтвердить что ты не робот

Как TRUNCATE TABLE с помощью Django ORM?

Чтобы очистить таблицу базы данных, я использую этот SQL-запрос:

TRUNCATE TABLE `books`

Как обрезать таблицу с использованием моделей Django и ORM?

Я пробовал это, но он не работает:

Book.objects.truncate()
4b9b3361

Ответ 1

Ближе всего вы получите с ORM Book.objects.all().delete().

Существуют различия: truncate, скорее всего, будет быстрее, но ORM также преследует ссылки на внешние ключи и удаляет объекты в других таблицах.

Ответ 2

Вы можете сделать это быстрым и легким способом, но не используя Django ORM. Вы можете выполнить необработанный SQL с помощью курсора связи Django:

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

Ответ 3

Вы можете использовать свойство model _meta для заполнения имени таблицы базы данных:

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

Важно. Это не работает для унаследованных моделей, поскольку они охватывают несколько таблиц!

Ответ 4

В дополнение к 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 Удалить все, кроме последних пяти запросов.

Я добавил это, осознав ответ, на который уже был дан ответ, но, надеюсь, это дополнение поможет некоторым другим людям.

Ответ 5

Теперь есть библиотека, которая поможет вам обрезать конкретный TABLE в вашей базе данных проекта Django, которая называется django-truncate.

Просто просто запустите python manage.py truncate --apps myapp --models Model1, и все данные в этом TABLE будут удалены!

Подробнее об этом читайте здесь: https://github.com/KhaledElAnsari/django-truncate

Ответ 6

$ python manage.py dbshell

=> TRUNCATE TABLE 'books_Book';
TRUNCATE TABLE

Ответ 7

Это напрямую не отвечает на вопрос OP, но, тем не менее, это решение, которое можно использовать для достижения того же - по-разному.


Ну, по какой-то странной причине (при попытке использовать предлагаемые методы RAW в других ответах здесь) я не смог урезать таблицу кэша базы данных Django, пока не сделал что-то вроде этого:

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

В принципе, мне пришлось прибегнуть к выдаче команды truncate через команды утилиты базы данных - psql в этом случае, так как я использую Postgres. Таким образом, автоматизация командной строки может обрабатывать такие угловые случаи.

Может кто-нибудь еще кого-нибудь спасти...