Как TRUNCATE TABLE используя ORM Джанго? - PullRequest
45 голосов
/ 07 июня 2010

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

TRUNCATE TABLE `books`

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

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

Book.objects.truncate()

Ответы [ 6 ]

58 голосов
/ 07 июня 2010

Самое близкое, что вы получите с ORM, это Book.objects.all().delete().

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

31 голосов
/ 07 июня 2010

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

from django.db import connection
cursor = connection.cursor()
cursor.execute("TRUNCATE TABLE `books`")
24 голосов
/ 27 октября 2011

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

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

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

8 голосов
/ 28 марта 2013

В дополнение к ответу Неда Батчелдера и упоминанию комментария Бернхарда Кирхера:

В моем случае мне нужно было очистить очень большую базу данных с помощью веб-приложения:

Book.objects.all().delete()

Который в среде разработки SQLlite вернул:

too many SQL variables

Итак, я добавил небольшой обходной путь. Возможно, это не самое лучшее, но, по крайней мере, оно работает, пока опция усеченной таблицы не будет встроена в 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 Удалить все, кроме последних пяти, из набора запросов ".

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

0 голосов
/ 25 апреля 2016

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

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

Узнайте больше об этом здесь: https://github.com/KhaledElAnsari/django-truncate

0 голосов
/ 14 ноября 2013

Это не является прямым ответом на вопрос ОП, но, тем не менее, является решением, которое можно использовать для достижения одного и того же - по-другому.


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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...