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