обновление базы данных django для отражения изменений в существующих моделях



Я уже определил модель и создал связанную с ней базу данных через manager.py syncdb. Теперь, когда я добавил некоторые поля в модель, я попытался syncdb снова, но вывод не отображается. При попытке получить доступ к этим новым полям из моих шаблонов я получаю исключение "нет такого столбца", что заставляет меня полагать, что syncdb на самом деле не обновлял базу данных. Какая здесь правильная команда?

696   8  

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 не изменяет существующие таблицы в базе данных, поэтому вам нужно сделать это вручную. Как я всегда это делаю:

  1. сначала измените класс модели.
  2. затем запустите: manage.py sql myapp.
  3. посмотрите на sql он печатает и посмотреть, как он представлял изменения, которые вы собираетесь сделать.
  4. внести изменения вручную с помощью менеджера баз данных.
  5. проверьте, все ли работает правильно с помощью администратора сайт.

Если вы используете 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

    Ничего не найдено.