这是一个Heroku特有的问题,Django项目1.11.24运行Python 3.6.5和Heroku postgres数据库。
在开发期间对两个不同分支进行测试期间,在不同的时间将不同的冲突迁移文件部署到Heroku服务器。我们认识到这一点,现在已经合并了迁移,但是Heroku psql db模式的迁移顺序与当前的迁移文件不一致。
因此,特定的表已经存在,因此在应用更新的合并迁移文件进行部署时出现以下错误:
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)
然而,尽管app和db都回滚,当我们在pql shell中使用dt
检查db表本身的回滚时,导致DuplicateTable错误的表仍然存在,因此db回滚实际上似乎并不影响django_migrations
表。
这是Heroku,所以我们不能假装迁移。
我们可以尝试删除已经存在的特定db表(或者删除整个db,因为它是一个测试服务器),但这似乎是不好的做法。在Heroku还有其他的表达方式吗?由于
我最终通过手动修改迁移文件以与已建立的模式依赖顺序保持一致来解决这个问题。非常不满意的修复,希望Heroku提供更好的解决方案(或更长的postgres数据库回滚窗口)