如何删除Heroku端旧migrations解决Django部署relation不存在报错
问题原因
本地删除所有迁移文件后重新生成的新迁移序列,和Heroku数据库中django_migrations表留存的旧版本迁移记录、实际表结构完全不匹配,Django执行迁移校验时无法找到对应模型表,就会抛出relation "accounts_goal" does not exist错误。
操作方案
根据你是否需要保留Heroku端的现有数据,二选一操作即可,操作前无论选哪种方案都先执行数据库备份,避免误操作丢数据:heroku pg:backups:capture -a 替换为你的Heroku应用名称
方案1:Heroku端无需要保留的测试/生产数据(操作最简单,适配你当前本地已重置迁移的状态)
- 执行命令重置Heroku数据库,清空所有旧表结构、旧迁移记录:
heroku pg:reset DATABASE_URL -a 替换为你的Heroku应用名称,执行后按终端提示输入应用名确认操作 - 推送本地最新代码到Heroku后,执行全新迁移生成匹配本地模型的表结构:
heroku run python manage.py migrate -a 替换为你的Heroku应用名称 - 按需创建超级管理员账号:
heroku run python manage.py createsuperuser -a 替换为你的Heroku应用名称
方案2:需要保留Heroku端现有业务数据
- 进入Heroku数据库命令行:
heroku pg:psql -a 替换为你的Heroku应用名称 - 执行SQL语句清空Django存储的迁移历史(该操作仅删除迁移记录,不会改动业务表和业务数据):
TRUNCATE TABLE django_migrations;,执行完成后输入\q退出数据库命令行 - 执行fake迁移,将你本地现有的所有迁移文件标记为已应用,避免Django重复执行建表逻辑报错:
heroku run python manage.py migrate --fake -a 替换为你的Heroku应用名称 - 校验迁移状态:执行
heroku run python manage.py showmigrations -a 替换为你的Heroku应用名称,确认所有迁移项前都标记[X]后,重启Heroku服务即可:heroku restart -a 替换为你的Heroku应用名称
注意:后续本地开发不要直接全量删除migrations文件,若需要调整迁移历史,必须保证本地、服务端的迁移文件序列、迁移记录完全对齐,否则会反复出现同类迁移冲突问题。
内容的提问来源于stack exchange,提问作者Sergo
相关产品推荐
相关产品推荐

