Когда мы развертываем наше приложение Django на Heroku, оно говорит "изменения, которые еще не отражены в миграции", но также говорит, что у него нет миграций для выполнения
Мое локальное репо обновлено с моим репо Heroku.
Когда я запускаю makemigrations
или migrate
локально, он говорит, что изменений нет.
Когда я запускаю makemigrations
на Heroku, он делает точно такие же изменения каждый раз, независимо от того, сколько раз я его запускаю:
python manage.py makemigrations users kits email
Migrations for 'kits':
apps/kits/migrations/0002_auto_20221209_1204.py
- Change Meta options on historicalkit
- Alter field history_date on historicalkit
Migrations for 'users':
apps/users/migrations/0002_auto_20221209_1204.py
- Change Meta options on historicaluser
- Alter field history_date on historicaluser
... но затем, если я запускаю migrate
на Heroku, он говорит, что нет ничего для миграции, и что есть не сделанные миграции:
python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, email, kits, sessions, users
Running migrations:
No migrations to apply.
Your models in app(s): 'kits', 'users' have changes that are not yet reflected in a migration, and so won't be applied.
Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.
Из-за этого все наше веб-приложение не работает. Что происходит?
Похоже, что существует несоответствие между миграциями на вашей локальной машине и миграциями на Heroku. Когда вы запускаете makemigrations на Heroku, он генерирует новые миграции для пользователей и наборов приложений. Когда вы затем запускаете migrate на Heroku, он не применяет эти миграции, поскольку они не были зафиксированы в вашей базе данных.
Одной из возможных причин этой проблемы является то, что вы, возможно, не выложили последнюю версию своего кода на Heroku. Когда вы запускаете makemigrations и migrate локально, они выполняются на коде, который находится на вашей локальной машине. Если вы внесли изменения в свой код и запустили makemigrations и migrate локально, но не перенесли эти изменения на Heroku, то код на Heroku не будет актуальным, и миграции на Heroku не будут соответствовать миграциям на вашей локальной машине.
Чтобы устранить эту проблему, вам нужно убедиться, что ваш код обновлен на Heroku. Это можно сделать, выложив последнюю версию кода на Heroku с помощью git. Например, вы можете использовать следующие команды:
git add .
git commit -m "Update code on Heroku"
git push heroku master
Если ваш код обновлен на Heroku, вы должны иметь возможность запускать makemigrations и выполнять миграции на Heroku без каких-либо ошибок. Если ваш локальный репозиторий обновлен на Heroku, то проблема может быть связана с тем, как Django обрабатывает миграции. Django хранит в базе данных записи о том, какие миграции были применены. Если записи в базе данных не соответствуют миграциям, которые присутствуют в вашем коде, то вы можете столкнуться с ошибками, подобными тем, которые вы наблюдаете.
Одним из возможных решений этой проблемы является сброс истории миграций на Heroku. Это удалит записи о примененных миграциях из базы данных, что позволит вам запустить makemigrations и выполнить миграцию снова.
Чтобы сбросить историю миграции на Heroku, вы можете использовать следующую команду:
heroku run python manage.py migrate --fake-initial
Это применит "фальшивые" начальные миграции, которые сбросят историю миграций и позволят вам запустить makemigrations и выполнить миграцию снова.
После выполнения этой команды вы сможете запустить makemigrations и выполнить миграцию на Heroku без каких-либо ошибок. Однако имейте в виду, что при этом будут удалены все данные, которые были добавлены в вашу базу данных в процессе миграции, поэтому вам может потребоваться восстановить данные из резервной копии, если она у вас есть.
Когда я запускаю
.makemigrations
на Heroku, он делает точно такие же изменения каждый раз, независимо от того, сколько раз я его запускаю
Это имеет смысл.
Когда вы heroku run
что-то делаете, Heroku запускает одиночный dyno, в котором выполняется команда. У этого dyno есть своя собственная эфемерная файловая система, которая не используется совместно с другими dyno.
Итак, каждый раз, когда вы выполняете эту команду, она генерирует новые файлы миграции, сохраняя их локально, а затем немедленно выбрасывает их, когда dyno раскручивается. Запустив ее снова, вы получаете свежий одноразовый dyno со свежей файловой системой.
Никогда не запускайте makemigrations
на Heroku. Вы должны делать это только локально.
Когда я запускаю
makemigrations
илиmigrate
локально, он говорит, что нет изменений
Вероятно, у вас есть актуальные файлы миграции (поэтому их не нужно генерировать), которые не зафиксированы (поэтому Heroku их не видит), или вы развертываете из ветки, где эти файлы не зафиксированы.
Убедитесь, что файлы миграции правильно зафиксированы локально, затем выполните повторное развертывание.