Heroku Django postgres migration merge: psycopg2.errors.DuplicateTable: relation already exists
Это специфическая для Heroku проблема с проектом Django 1.11.24 под управлением Python 3.6.5 и базой данных Heroku postgres.
Во время тестирования двух разных веток в процессе разработки на сервер Heroku в разное время были развернуты разные конфликтующие файлы миграции. Мы поняли это и теперь объединили миграции, но порядок, в котором схема базы данных Heroku psql была перенесена, не соответствует порядку в текущих файлах миграции
В результате, определенные таблицы уже существуют, поэтому при развертывании, применяя обновленные объединенные файлы миграции, возникает ошибка:
psycopg2.errors.DuplicateTable: relation "table_foo" already exists
В heroku run python manage.py showmigrations -a appname
все миграции показаны как запущенные.
Мы следовали документации Heroku и сделали следующее:
- Откатили само приложение до момента, когда конфликтующие миграции произошли и были запущены (https://blog.heroku.com/releases-and-rollbacks)
- Откат самой базы данных postgres к дате до того момента, когда конфликтующие миграции имели место и были запущены (https://devcenter.heroku.com/articles/heroku-postgres-rollback)
Однако, несмотря на откат и приложения, и базы данных, когда мы проверяем сами таблицы базы данных при откате в pql shell с помощью \dt
, таблица, вызывающая ошибку DuplicateTable err, все еще существует, так что откат базы данных, похоже, не влияет на таблицу django_migrations
.
Это Heroku, поэтому мы не можем подделать миграции.
Мы могли бы попытаться удалить конкретные таблицы базы данных, которые уже существуют (или удалить всю базу данных, поскольку это тестовый сервер), но это кажется плохой практикой. Есть ли другой способ решить эту проблему в Heroku? Спасибо
В конечном итоге я исправил это, вручную изменив файлы миграции, чтобы привести их в соответствие с установленным порядком зависимостей схем. Очень неудовлетворительное исправление, хотелось бы, чтобы Heroku предложил лучшее решение для этого (или более длительное окно отката базы данных postgres)