Завершить 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 и напишите свой собственный, который сначала создает/создает базу данных.