django: обновить схему базы данных без потери данных - PullRequest
5 голосов
/ 21 апреля 2011

Какое наилучшее решение, если я хочу обновить (изменить) мою схему базы данных (добавить новые поля в таблицы, добавив их только в модели django) без потери данных в этих таблицах? "syncdb", конечно, не добавляет их, поэтому мне нужны ваши советы, как изменить таблицы, не удаляя их и не воссоздавая заново с помощью syncdb.

Спасибо, Игнас

Ответы [ 3 ]

9 голосов
/ 21 апреля 2011

Когда юг не вариант, я просто вручную пишу сценарии для небольших изменений. и большие я использую

./manage.py dumpdata appname

http://docs.djangoproject.com/en/dev/ref/django-admin/#dumpdata-appname-appname-appname-model

Бросьте это в файл. Запустите регулярное выражение замены, чтобы обновить все добавленные / удаленные поля, и тогда возможен сброс этого приложения. Я должен признать, что давно этого не делал, но могу получить какой-то конкретный код, чтобы сделать это для вас, если это необходимо.

загружается обратно с loaddata

редактировать

Данные дампа Django для одной модели? Этот вопрос похож и может содержать информацию, о которой я говорил.

Все же дайте мне знать, если вам нужно, и я выкопаю свой старый сценарий (или напишу хороший простой) для вас.

UPDATE

./manage.py dumpdata appname --indent=4 > appname.json

#open your fav text editor and do a find/replace 

./manage.py reset appname
./manage.py loaddata appname.json

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

Примечания: --indent = 4 прекрасно форматирует все для вас. Это означает 4 пробела. Сброс ./manage.py работает только в pre django 1.3 (gah!) в django 1.3. Вам нужно будет сделать ./manage dbshell и drop table. SQL для этого находится из команды ./manage.py sqlreset appname.

6 голосов
1 голос
/ 30 января 2014

Django 1.7 имеет встроенную поддержку миграции.

См. https://docs.djangoproject.com/en/dev/releases/1.7/#schema-migrations

...