Завершить django DB reset

Как полностью reset моя Django (1.2 альфа) DB (удаление всех таблиц, а не просто их очистка)?

manage.py flush делает слишком мало (не будет работать, если есть изменения схемы), а manage.py reset требует, чтобы я указывал все приложения (и, как представляется, принимает формат, отличный от ".join(INSTALLED_APPS)), Я, очевидно, могу достичь этого по-разному, но я решил, что для этого должен быть разумный, DB backend агностический способ.

[Edit: Я ищу что-то, что я могу вызвать из script, например. Makefile и продолжает работать, если я изменяю БД или добавляю к settings.INSTALLED_APPS]

Ответы

Ответ 1

Этот фрагмент дает вам код для команды manage.py reset_db, которую вы можете установить, это минимальное изменение, которое решает вашу проблему


Тем не менее, из комментариев ниже:

Вы можете просто установить расширения команд Django, чтобы получить reset_db и другие лакомства: https://github.com/django-extensions/django-extensions

Ответ 2

Вы хотите sqlreset:

% python manage.py help sqlreset
Usage: manage.py sqlreset [options] <appname appname ...>

Prints the DROP TABLE SQL, then the CREATE TABLE SQL, for the given app name(s).

Options:
  -v VERBOSITY, --verbosity=VERBOSITY
                        Verbosity level; 0=minimal output, 1=normal output,
                        2=all output
  --settings=SETTINGS   The Python path to a settings module, e.g.
                        "myproject.settings.main". If this isn't provided, the
                        DJANGO_SETTINGS_MODULE environment variable will be
                        used.
  --pythonpath=PYTHONPATH
                        A directory to add to the Python path, e.g.
                        "/home/djangoprojects/myproject".
  --traceback           Print traceback on exception
  --version             show program version number and exit
  -h, --help            show this help message and exit

Как и при изменении модели, Django автоматически не сделает это за вас. Он будет выводить команды для копирования и вставки.

Ответ 3

Просто назначьте новую базу данных и отбросьте эту db с консоли db. Мне кажется, что это самый простой.

Ответ 4

Хм, может быть, вы лжете, чтобы manage.py, притворяясь, что делаете светильники, но только для поиска приложений:

apps = $(python manage.py makefixture 2 > & 1 | egrep -v '(^ Ошибка | ^ django)' | awk -F. '{print $2}' | uniq); для я в $apps; сделать python manage.py sqlreset $i; сделано | grep DROP

Распечатывает список операторов DROP TABLE для всех таблиц приложений вашего проекта, исключая сами таблицы django. Если вы хотите включить их, удалите шаблон |^django vom egrep.

Но как подать правильную базу данных базы данных? sed/awk-ing через settings.conf? Или лучше, используя небольшой файл settings.conf для чтения python script.

Ответ 5

Предполагая, что вы (к счастью) в среде Linux, а также:

  • с использованием MySQL и знать пользователя/пароль для доступа к проекту db
  • bash, mysql, readlink установлены
  • settings.py - settings.py
  • Имя dbname совпадает с именем проекта django (см. ниже MYAPP var)
  • все APPS, которые вы хотите использовать reset, перечислены в INSTALLED_APPS как строки с именами полностью квалифицированных модулей (начиная с имени вашего проекта django).

Измените свою текущую папку на код проекта, где находятся файлы manage.py и settings.py. Затем запустите следующее:

MYAPP=$(basename $(dirname `readlink -m settings.py`));DJANGOAPPS=$(echo 'import settings; print " ".join([ str(app).lstrip("'${MYAPP}'.") for app in settings.INSTALLED_APPS if "'${MYAPP}'" in app ])' | python - ); python manage.py sqlreset $DJANGOAPPS | mysql -u root --password ${MYAPP}

Если вы понимаете, что происходит в этом bash oneliner - это не должно быть проблемой для реализации этой идеи (например, поместите ее в Makefile).

Ответ 6

взгляните на команду reset в коде django и напишите свой собственный, который сначала создает/создает базу данных.