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

  1. Измените зависимости конфликтующей миграции, чтобы она больше не ссылалась на уже примененную миграцию.
  2. Затем снова запустите 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;