Чтобы очистить таблицу базы данных, я использую этот SQL-запрос:
TRUNCATE TABLE `books`
Как обрезать таблицу с использованием моделей Django и ORM?
Я пробовал это, но он не работает:
Book.objects.truncate()
Чтобы очистить таблицу базы данных, я использую этот SQL-запрос:
TRUNCATE TABLE `books`
Как обрезать таблицу с использованием моделей Django и ORM?
Я пробовал это, но он не работает:
Book.objects.truncate()
Ближе всего вы получите с ORM Book.objects.all().delete()
.
Существуют различия: truncate, скорее всего, будет быстрее, но ORM также преследует ссылки на внешние ключи и удаляет объекты в других таблицах.
Вы можете сделать это быстрым и легким способом, но не используя Django ORM. Вы можете выполнить необработанный SQL с помощью курсора связи Django:
from django.db import connection
cursor = connection.cursor()
cursor.execute("TRUNCATE TABLE `books`")
Вы можете использовать свойство model _meta для заполнения имени таблицы базы данных:
from django.db import connection
cursor = connection.cursor()
cursor.execute('TRUNCATE TABLE "{0}"'.format(MyModel._meta.db_table))
Важно. Это не работает для унаследованных моделей, поскольку они охватывают несколько таблиц!
В дополнение к 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 Удалить все, кроме последних пяти запросов.
Я добавил это, осознав ответ, на который уже был дан ответ, но, надеюсь, это дополнение поможет некоторым другим людям.
Теперь есть библиотека, которая поможет вам обрезать конкретный TABLE в вашей базе данных проекта Django, которая называется django-truncate.
Просто просто запустите python manage.py truncate --apps myapp --models Model1
, и все данные в этом TABLE будут удалены!
Подробнее об этом читайте здесь: https://github.com/KhaledElAnsari/django-truncate
$ python manage.py dbshell
=> TRUNCATE TABLE 'books_Book';
TRUNCATE TABLE
Это напрямую не отвечает на вопрос OP, но, тем не менее, это решение, которое можно использовать для достижения того же - по-разному.
Ну, по какой-то странной причине (при попытке использовать предлагаемые методы RAW в других ответах здесь) я не смог урезать таблицу кэша базы данных Django, пока не сделал что-то вроде этого:
import commands
cmd = ['psql', DATABASE, 'postgres', '-c', '"TRUNCATE %s;"' % TABLE]
commands.getstatusoutput(' '.join(cmd))
В принципе, мне пришлось прибегнуть к выдаче команды truncate
через команды утилиты базы данных - psql
в этом случае, так как я использую Postgres. Таким образом, автоматизация командной строки может обрабатывать такие угловые случаи.
Может кто-нибудь еще кого-нибудь спасти...