Проблема дублирования / уже существующих миграций Django

У меня довольно большая кодовая база на django, с несколькими приложениями, и в какой-то момент возникла проблема: каждый раз, когда я меняю или добавляю модели и пытаюсь сделать миграцию, появляется ошибка: django.db.utils.ProgrammingError: relation "appname_modelname" already exists. Проблема длится уже некоторое время - файл миграции всегда создается под одним и тем же номером - 0114 (я, кстати, не смог найти этот файл), и все новые исправления записываются в него вместе с предыдущими, из-за чего проблема растет, как снежный ком.

Я не хотел углубляться в решение и просто вручную удалил все нововведения из базы данных - все, что вызывало появление конфликта "уже существует". Таким образом, чтобы миграция прошла успешно, мне пришлось вручную удалить все модели или поля таблиц, которые я создал после появления этой проблемы. Но теперь я начинаю работать в prod с этим кодом и заполнять его данными, и уже невозможно удалить все данные из соответствующих таблиц. Я понятия не имею, почему возникла эта проблема и как ее решить, и буду очень признателен за ваш совет.

Я пытался сделать подделку, но тогда, очевидно, нужные мне исправления просто не попадают в базу данных. У меня есть гипотеза о том, чем это вызвано: У меня есть три контейнера docker, один api, и два для celery. В api контейнере я написал команду в bash файле при запуске

python3 /usr/srv/h_api/src/manage.py makemigrations && python3 /usr/srv/h_api/src/manage.py migrate

вместо

python3 /usr/srv/h_api/src/manage.py makemigrations

чтобы мне не приходилось каждый раз делать это вручную. Я не понимаю почему, но судя по совпадению времени, похоже, что проблема началась именно из-за этого. Прошло уже несколько недель с тех пор, как я изменил эту строку, но проблема осталась.

Как мне зафиксировать предыдущие изменения в базе данных и заставить django создать следующий файл миграции под номером 0115?

Это может быть немного рискованно, но в прошлом мне это помогало. Я предлагаю создать копию вашего проекта в другой папке и попробовать это в безопасности вдали от оригинального проекта. Также, если вы используете базу данных postgresql, просто переключитесь на фиктивную базу данных, хотя это не должно иметь значения, но просто на всякий случай.

Внутри папки migrations, внутри папки app, попробуйте удалить все файлы внутри pycache ИСКЛЮЧАЯ init. cpython-39.pyc и 0001_initial.cpython-39.pyc, а внутри папки migrations удалите все файлы EXCEPT init.py и 0001_initial.py.

ВАЖНО: Удаляйте из pycache ВНУТРИ миграций, а не вне их.

Удалите папку migrations, добавьте случайное поле в ваши модели, makemigrations, migrate, удалите случайное поле из ваших моделей, makemigrations, migrate.

Вернуться на верх