2010-02-18 2 views
15

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

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

[Изменить: Я ищу что-то, что я могу вызвать из сценария, например. файл сборки и продолжает работать, если я изменить бэкэнд DB или добавить к settings.INSTALLED_APPS]

ответ

16

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


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

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

+7

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

+0

Это выглядит многообещающим! – jathanism

+0

Отлично - это выглядит точно, что мне нужно! –

1

Вы хотите 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's version number and exit 
    -h, --help   show this help message and exit 

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

+0

'manage.py reset ', о котором я упоминал выше, просто является оболочкой вокруг' sqlreset', поэтому в точности такая же проблема: я не хочу вручную перечислять все имена. Я хочу, чтобы решение было автоматизировано и продолжает работать, если я добавлю 'INSTALLED_APPS' в' settings.py'. –

+0

Тогда вам придется катить свой собственный скрипт. Я не думаю, что эта функциональность существует как есть. – jathanism

0

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

+0

Извините, я должен был дать понять, что мне нужно что-то, что можно автоматизировать. –

+0

@as: Как невозможно сбрасывать базу данных? Какая у вас база данных? Напишите SQL-скрипт для 'DROP DATABASE x;' и запустите его. –

-1

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

0

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

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

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

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

0

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

  • с использованием MySQL и знать пользователя/пароль для доступа к БД проекта
  • Баш, MySQL, readlink установлены
  • settings.py это настройки.ру
  • имя_бд таким же, как ваше имя проекта Джанго (см MYAPP вара ниже)
  • всех приложений, которые вы хотите сбросить, перечислены в INSTALLED_APPS как строки с полностью квалифицированными именами модулей (начиная с названием вашего Джанго проект)

Измените свою текущую папку на код проекта, где находятся параметры 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} 

Если вы понимаете, что происходит в этом Баш Oneliner - это не должно быть проблемой, чтобы построить на этой идее (например, поместить его в Makefile).

+0

Обратите внимание, что echo 'DROP DATABASE dbx;' | mysql dbx, как предложил S.Lott, также работает в мире командной строки unix. Затем вы просто вызываете syncdb –

Смежные вопросы