Django: удалить все данные из каждой таблицы (но сохранить таблицы сами) - PullRequest
10 голосов
/ 28 октября 2011

Я пытаюсь синхронизировать данные между двумя установками django (производство и тестирование).Я делаю это, используя ./manage.py dumpdata --natural на производстве, затем ./manage.py loaddata в свежую syncdb 'базу данных при тестировании.

Все работало нормально, пока я не добавил новое специальное разрешение.Производство syncdb загрузило это новое разрешение в другом порядке (с другим первичным ключом), чем новое syncdb в пустой базе данных.Следовательно, он получает другой идентификатор.Поэтому, несмотря на использование естественных ключей, когда я пытаюсь загрузить данные, я получаю эту ошибку, когда загружается первый объект разрешения не по порядку:

IntegrityError: duplicate key value violates unique constraint "auth_permission_content_type_id_codename_key"

Самый простой способ, которым я могу придумать, чтобыисправить это, чтобы удалить все данные из каждой таблицы в тестовой установке, то есть использовать syncdb просто для создания таблиц, а не для загрузки исходных данных.Но syncdb не позволяет пропустить начальный шаг данных / сигналов.Если не считать явного перечисления каждой модели или имени таблицы, как я могу удалить все исходные данные после вызова syncdb?Или есть способ создать только пустые таблицы без использования syncdb?

./manage.py flush - это не то, что мне нужно - он перезагружает исходные данные и запускает сигналы syncdb.

Ответы [ 2 ]

9 голосов
/ 20 июля 2012

Согласно справке для команды flush (я использую Django 1.3.1), выполняемый SQL - это тот же SQL, полученный из ./manage.py sqlflush, а затем исходные данные фиксируются заново.

$ python manage.py help flush 
Usage: manage.py flush [options]

Executes ``sqlflush`` on the current database.

Чтобы получить те же возможности очистки данных за вычетом загрузки прибора, вы можете получить SQL, вызвав ./manage.py sqlflush, а затем выполнить этот SQL, используя встроенную поддержку Django для выполнения произвольного SQL:

from django.core.management import call_command, setup_environ
from your_django_project import settings
setup_environ(settings)

from django.db import connection
from StringIO import StringIO

def main():
    # 'call' manage.py flush and capture its outputted sql
    command_output = StringIO()
    call_command("sqlflush", stdout=command_output)

    command_output.seek(0)
    flush_sql = command_output.read()

    # execute the sql
    # from: https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly
    cursor = connection.cursor()
    cursor.execute(flush_sql)

    print "db has been reset"

if __name__ == '__main__':
    main()

Это дает дополнительное преимущество, заключающееся в том, что вы можете изменить SQL с ./manage.py sqlflush перед выполнением, чтобы избежать очистки таблиц, которые вы можете оставить нетронутыми.

Кроме того, в соответствии с текущими документами Django , в Django 1.5 новый параметр ./manage.py flush --no-initial-data сбрасывает данные и не загружает исходный фиксатор данных.

0 голосов
/ 28 октября 2011

Для Django <= 1.4 вы можете использовать команду управления <a href="https://docs.djangoproject.com/en/1.4/ref/django-admin/#reset-appname-appname" rel="nofollow">reset.

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