django syncdb и обновленная модель


86

Я недавно обновил свою модель, добавил к ней BooleanField, но когда я это сделаю python manage.py syncdb, он не добавит новое поле в базу данных для модели. Как я могу это исправить ?


17
Тот факт, что Django не поддерживает такую ​​фундаментальную вещь из коробки, не позволил мне вообще использовать ее для создания моделей. Тот факт, что они считают ORM, который обрабатывает создание таблиц, но не (на месте) их модификацию, качественным релизом, почти не позволил мне полностью использовать Django.
Гленн Мейнард,

3
Тот факт, что Django допускает такую ​​отличную подключаемость приложений, делает Django потрясающим и делает отсутствие встроенной поддержки для модификации таблиц практически несущественным. Насколько сложно установить приложение?
Доминик Роджер,

@Glenn, правильно планируйте свои модели на этапе проектирования, и у вас не будет этой проблемы. Если вы добавляете новые функции, используйте пакет миграции, например South. Миграция на месте часто бывает сложной; в любом случае слишком сложно для простой команды управления Django.
Soviut

Ответы:


100

Начиная с Django 1.7

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

Для Django 1.6 и ранее

Django не поддерживает миграции из коробки. Однако есть подключаемое приложение для Django, которое делает именно это, и оно отлично работает. Это называется Юг .


1
Примечание: у меня возникла проблема с использованием South для переноса моделей с пользовательским сервером базы данных (например, django-mssql)
Дон,

1
Юг очень-очень красивый! Спасибо за подсказку
Жюльен Греард

14

В настоящее время Django не делает этого автоматически. Ваши варианты:

  1. Удалите таблицу из базы данных, а затем воссоздайте ее в новой форме с помощью syncdb.
  2. Распечатайте SQL для базы данных с помощью python manage.py sql (appname), найдите добавленную строку для поля и добавьте ее вручную с помощью alter tableкоманды SQL. (Это также позволит вам выбрать значения поля для ваших текущих записей.)
  3. Используйте Юг (согласно ответу Доминика ).

11

Следуй этим шагам:

  1. Экспортируйте свои данные в прибор с помощью команды управления dumpdata
  2. Бросьте стол
  3. Запустите syncdb
  4. Перезагрузите данные из прибора с помощью команды управления loaddata

Полное падение и перезагрузка для чего-то, что должно быть выполнено на месте? Это ужасно.
Гленн Мейнард,

3
Это простая команда управления, а не пакет миграции! Django не имеет возможности предсказать, как изменились ваши данные или как их сохранить, поэтому он настаивает на том, чтобы вы делали это самостоятельно. Если вам это не нравится, используйте инструмент миграции, например South.
Soviut

8

Как было предложено в верхнем ответе, я попытался использовать South , и после часа разочарования из-за неясных ошибок миграции решил вместо этого использовать Django Evolution .

Я думаю, что с ним легче начать, чем с Югом, и он отлично работал, когда я впервые печатал ./manage.py evolve --hint --execute, так что я доволен.


7
После почти года использования Django Evolution и South я меняю свое мнение. Юг - это круто. Но это очень похоже на Git в том смысле, что вы должны убедиться, что действительно понимаете, как он работает . Если вы набираете команды вслепую, вы, скорее всего, облажаетесь в первый раз, когда вы или кто-то из вашей команды совершит ошибку.
Дэн Абрамов

2

Давно не использовал django, но, кажется, помню, что syncdb действительно выполняет команды alter в таблицах db. вам нужно отбросить таблицу, затем запустить ее снова, и она снова будет создана.

изменить: извините, НЕ выполняет изменения.


Тогда это не выполняющиеся alter tableкоманды, это выполняемые create tableкоманды.
Доминик Роджер,

ну, у меня есть данные в базе данных, поэтому было бы здорово, если бы я преодолел эту проблему, не упуская.
Hellnar,

1
Думаю, вы хотели сказать, что syncdb НЕ выполняет команды изменения. Вам не нужно отбрасывать таблицу, вы также можете вручную добавить новое поле в свой sql.
Odif Yltsaeb,

да, но вопрос касался использования syncdb, поэтому в этом случае вам придется удалить таблицу, чтобы использовать syncdb, или использовать плагин, упомянутый ниже.
Alex H,

1
Если вас не устраивает South, попробуйте вместо этого Django Evolution. Хорошо сработало для меня. stackoverflow.com/questions/1605662/…
Дэн Абрамов


0

Если вы запускаете Django с Apache и MySQL, перезапустите apache после выполнения миграции с помощью makemigrations .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.