2015-10-27 1 views
2

Я по ошибке удалил все .py файл, путь к Projectname/APPNAME/миграции, она включает как:makemigrations не работает после удаления Миграции

0001_initial.py

0011_auto_20150918_0723.py

0002_auto_20150819_1301.py

...

Теперь даже я обновил модель файл и запустите команду python manage.py makemigrations, он всегда подскажет с никаких изменений не обнаружено.

Как я могу все восстановить?

ответ

7

Прежде всего, , даже если это случилось с вами на производстве, не паникуйте.

Когда вы удалили все миграции, django забыл, что это приложение должно управляться миграциями. Джанго по умолчанию обратно в наследство python manage.py syncdb поведения migrationless и не будет пытаться обнаружить изменения или создавать новые миграции при запуске python manage.py makemigrations

Для того, чтобы сделать его знать о миграции, вы должны выполнить команду специально для вашего приложения:

python manage.py makemigrations appName 

Однако для запущенного приложения, Джанго не будет в состоянии обнаружить, что новые миграционные уже применяются в базе данных, и будет пытаться запустить их снова, когда вы запускаете python manage.py migrate.

Когда это происходит, миграция терпит неудачу, сказав, что relation appName.XYZ already exists!.

Чтобы Джанго понять, что ваша миграция уже отражена в базе данных вы должны фальсифицировать их:

python manage.py migrate appName --fake 

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

Update (благодаря @GwynBleiD):

Одной из проблем является то, что удаленные миграции, которые уже были применены, будут перечислены в таблице истории миграции в базе данных. Это не будет проблемой для начального python manage.py makemigrations myApp, однако для любых других перемещений это приведет к ошибке около inconsistent migration history.

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

+0

Существует одна проблема: если удаленные миграции уже были применены, они будут перечислены в таблице истории миграции в базе данных - для начальной миграции это не будет проблемой, django проигнорирует ее, но для любых других миграций она будет бросать ошибка о непоследовательной истории миграции. Чтобы этого избежать, вы должны вручную удалить любую строку из таблицы 'django_migrations' в базе данных, которая ссылается на несуществующие миграции. – GwynBleidD

+0

Конечно, вы можете, это не отдельный ответ. – GwynBleidD