Django manage.py: миграция применяется до ее зависимости
При запуске python manage.py migrate
я сталкиваюсь с этой ошибкой:
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration
<appname>.0016_auto_<date2>_<time2> is applied before its dependency
<appname>.0001_squashed_0015_auto_<date1>_<time1>
работает showmigrations возвращает:
<appname>
[X] 0001_squashed_0015_auto_<date1>_<time1> (15 squashed migrations)
[X] 0016_auto_<date2>_<time2>
[ ] 0017_<modelname>_squashed_0019_auto_<date3>_<time3> (3 squashed migrations)
Вчера я пробовал django-расширения, когда все это испортилось после того, как я выполнил несколько прямых SQL-запросов, и я полностью сбросил настройки, используя git. Я все еще изучаю миграции, поэтому не понимаю, в чем дело, поскольку мне кажется, что обе миграции уже применены.
Спасибо за помощь!
Ответы
Ответ 1
Вы раздавили миграции, поэтому одна из зависимостей, которые 0016_auto_<date2>_<time2>
имела, теперь является частью вновь созданных сжатых миграций. Тем временем 0016_auto_<date2>_<time2>
уже запущен, и теперь вы пытаетесь запустить сжатую миграцию.
Я лично не знаю, есть ли способ исправить это автоматически. Вам нужно будет исправить проблемы самостоятельно. Если у вас есть контроль версий, верните эти изменения и попытайтесь переосмыслить, как вы должны сквоивать миграцию, не затрагивая старые.
Ответ 2
запустить этот python manage.py dbshell
INSERT INTO public.django_migrations(app, name, applied)
VALUES ('YOUR_APP_NAME, '0017_<modelname>_squashed_0019_auto_<date3>_<time3>', now());
и ты должен быть в порядке. Если ваша миграция сильно изменилась в базе данных, то, боюсь, это будет не так легко исправить.
Ответ 3
- Измените зависимости конфликтующей миграции, чтобы она больше не ссылалась на уже примененную миграцию.
-
Затем снова запустите python manage.py migrate, и это должно быть исправлено.
- Предупреждение: это работает только при условии, что состояние базы данных соответствует состоянию, которое вы получили, применив конфликтующую миграцию.
Ответ 4
Это сработало для меня. Я благодарю своего коллегу за то, что он поделился этими знаниями после того, как много часов искал в Интернете.
Запустите вашу db оболочку python manage.py dbshell
Используйте базу данных, которую вы хотите. Если вы не знаете, запустите "show database" mysql> use;
Получить все миграции под вашим приложением mysql> select * from django_migrations, где app = '';
Вы увидите вывод с идентификаторами рядом со всеми миграциями. Посмотрите на миграцию, которую вы хотите отбросить. Скажем, идентификатор: 361 mysql> delete from django_migrations, где id = 361;
Ответ 5
Это сработало для меня. Я благодарю своего коллегу за то, что он поделился этими знаниями после того, как много часов искал в Интернете.
Начните свою оболочку БД
python manage.py dbshell
Используйте базу данных, которую вы хотите. Если вы не знаете, запустите "Показать базы данных"
mysql>use <database_name>;
Получить все миграции под вашим приложением
mysql> select * from django_migrations where app='<app>';
Вы увидите вывод с идентификаторами рядом со всеми миграциями. Посмотрите на миграцию, которую вы хотите отбросить. Скажите, что идентификатор 361
mysql> delete from django_migrations where id=361;