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

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

68
задан akki 20 April 2014 в 16:20
поделиться

6 ответов

Похоже, вам нужна миграционная система. Юг действительно хорош, отлично работает, имеет некоторые средства автоматизации, чтобы облегчить ваш рабочий процесс. И имеет отличное учебное пособие .


примечание: syncdb не может обновить ваши существующие таблицы. Иногда невозможно решить, что делать автоматически - вот почему южные скрипты такие замечательные.

33
ответ дан 24 November 2019 в 14:00
поделиться

Синхронизация Django не изменяет существующие таблицы в базе данных, поэтому делать это нужно вручную. Я всегда так делаю:

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

Если вы используете sqllite, то хорошим менеджером является плагин Firefox: ссылка

9
ответ дан 24 November 2019 в 14:00
поделиться

deseb - отличный инструмент для этого.

Установив его, вы можете написать sqlevolve ./manage.py и он сгенерирует sql команды, необходимые для синхронизации структуры БД с вашими моделями.

.
3
ответ дан 24 November 2019 в 14:00
поделиться

Вам необходимо удалить ваши таблицы, прежде чем вы сможете воссоздать их с помощью syncdb.

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

Есть инструменты, которые помогут в этом. Однако во многих случаях это так же просто сделать вручную.

2
ответ дан 24 November 2019 в 14:00
поделиться

Другим инструментом будет эволюция джанго. В большинстве случаев не требуется сбрасывать таблицу.

эволюция джанго

Просто установите его как любое другое приложение джанго и запустите:

python manage.py evolve --hint --execute

.
8
ответ дан 24 November 2019 в 14:00
поделиться

Начиная с версии Django 1.7+, встроенная поддержка миграции позволяет выполнять миграцию схемы базы данных, сохраняющей данные. Вероятно, это лучший подход, чем решение, представленное ниже.

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

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

(Команда reset была устарела и затем удалена в Django 1.5)

Если Ваши изменения нарушают Вашу старую схему, это не сработает - и в этом случае такие инструменты, как South или Django Evolution, великолепны.

138
ответ дан 24 November 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: