обновление базы данных django для отражения изменений в существующих моделях
Я уже определил модель и создал связанную с ней базу данных через manager.py syncdb. Теперь, когда я добавил некоторые поля в модель, я попытался syncdb снова, но вывод не отображается. При попытке получить доступ к этим новым полям из моих шаблонов я получаю исключение "нет такого столбца", что заставляет меня полагать, что syncdb на самом деле не обновлял базу данных. Какая здесь правильная команда?
8 ответов:
похоже, что вам нужна миграционная система. Южный очень хороший, работает отлично, имеет некоторые инструменты автоматизации, чтобы облегчить ваш рабочий процесс. И имеет большое учебник.
Примечание: syncdb не может обновить существующие таблицы. Иногда невозможно решить, что делать автоматически-вот почему южные сценарии настолько велики.
начиная с Django 1.7+, встроенный поддержка со стороны, позволяет переносить схемы баз данных, которые сохраняют данные. Это, вероятно, лучший подход, чем Решение ниже.
другой вариант, не требующий дополнительных приложений, заключается в использовании встроенного
manage.pyфункции для экспорта данных, очистки базы данных и восстановления экспортированных данных.методы, приведенные ниже, обновить таблицы базы данных для вашего приложения, но полностью уничтожить данные, которые существовали в этих таблиц. Если изменения, внесенные в модель приложения, не нарушают вашу старую схему (например, вы добавили новое необязательное поле), вы можете просто сбросить данные до и перезагрузить их после этого, например:
Django 1.4.15 и ранее
python manage.py dumpdata <your_app> > temp_data.json python manage.py reset <your_app> python manage.py loaddata temp_data.jsonв Django 1.5 и новее
python manage.py dumpdata <your_app> > temp_data.json python manage.py sqlclear <your_app> | python manage.py dbshell python manage.py syncdb python manage.py loaddata temp_data.json(The
resetкоманда была устаревшей, а затем удалена в Django 1.5)если изменения нарушают ваши старая схема это не будет работать - в этом случае инструменты, такие как Южный или Django Evolution большие.
начиная с Django 1.7, теперь вы можете сделать это с помощью собственных миграций. Просто беги
python manage.py makemigrations <your app name> python manage.py migrate
syncdb Django не изменяет существующие таблицы в базе данных, поэтому вам нужно сделать это вручную. Как я всегда это делаю:
- сначала измените класс модели.
- затем запустите: manage.py sql myapp.
- посмотрите на sql он печатает и посмотреть, как он представлял изменения, которые вы собираетесь сделать.
- внести изменения вручную с помощью менеджера баз данных.
- проверьте, все ли работает правильно с помощью администратора сайт.
Если вы используете sqllite хорошим менеджером является плагин firefox:ссылке
еще одним инструментом будет Django evolution. В большинстве случаев не требуется сбрасывать таблицу.
просто установите его как любое другое приложение Django и запустите:
python manage.py evolve --hint --execute
deseb - это отличный инструмент для этого.
установив его, вы можете написать. /manage.py sqlevolve и он будет генерировать команды sql, необходимые для синхронизации структуры базы данных с вашими моделями.
вы должны удалить свои таблицы, прежде чем вы можете воссоздать их с
syncdb.Если вы хотите сохранить существующие данные, то вам нужно выгрузить базу данных, брось таблицы, выполните команду
syncdbчтобы построить новую базу данных, затем перезагрузите старые данные в новые таблицы.есть инструменты, которые помогают это сделать. Однако во многих случаях это так же легко сделать вручную.
для пользователей версий 1.4.1 и выше команда изменилась на
python manage.py flushпожалуйста, читайте официальный документ до он удалит все ваши данные.
Comments