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

86

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

Hellnar
источник
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. вам нужно отбросить таблицу, затем запустить ее снова, и она снова будет создана.

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

Alex H
источник
Тогда это не выполняющиеся alter tableкоманды, это выполняемые create tableкоманды.
Доминик Роджер,
ну, у меня есть данные в базе данных, поэтому было бы здорово, если бы я преодолел эту проблему, не упуская.
Hellnar,
1
Думаю, вы хотели сказать, что syncdb НЕ выполняет команды изменения. Вам не нужно отбрасывать таблицу, вы также можете вручную добавить новое поле в свой sql.
Odif Yltsaeb,
да, но вопрос касался использования syncdb, поэтому в этом случае вам придется удалить таблицу, чтобы использовать syncdb, или использовать плагин, упомянутый ниже.
Alex H,
1
Если вас не устраивает South, попробуйте вместо этого Django Evolution. Хорошо сработало для меня. stackoverflow.com/questions/1605662/…
Дэн Абрамов
1

В django 1.6

  • Сначала мы побежали - python manage.py sql <app name>

  • Тогда мы должны бежать - python manage.py syncdb

Монвара Хосейн Мунни
источник
0

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

Фелипе Перри
источник