PG::UndefinedTable错误求助:Heroku部署时stocks表不存在问题
搞定Heroku上的PG::UndefinedTable迁移错误
嘿,我遇过几乎一模一样的问题,这事儿根源出在Heroku数据库里的迁移记录没跟上你本地清理的节奏!让我一步步教你解决:
问题到底出在哪?
你本地已经删掉了20180515064500这个迁移文件,还重置了本地数据库,但Heroku的schema_migrations表里还留着这条记录。当你推代码上去执行迁移时,Heroku傻呵呵地要找这个不存在的迁移来跑,可这时候stocks表还没被创建(因为主分支之前漏了创建它的迁移),自然就炸出PG::UndefinedTable错误了。
两种解决办法,按需选
办法一:清理残留的迁移记录(不删数据,优先用这个)
- 先备份!先备份!先备份! 重要的事说三遍:
heroku pg:backups:capture - 进Heroku的数据库控制台看看:
heroku run rails dbconsole - 查一查是不是真的有那条残留记录:
要是能查到这条,那就对了。SELECT version FROM schema_migrations WHERE version = '20180515064500'; - 把这条多余的记录删掉:
DELETE FROM schema_migrations WHERE version = '20180515064500'; - 退出控制台,重新跑迁移:
这时候Heroku会按你当前代码里的迁移文件来执行,先创建heroku run rake db:migratestocks表,再处理其他加字段的迁移,就不会报错了。
办法二:直接同步本地schema(迁移彻底乱了的时候用)
如果你的本地schema.rb已经是完全正确的(包含stocks表和所有需要的字段),那直接把本地schema同步到Heroku更省事:
- 还是先备份:
heroku pg:backups:capture - 重置Heroku数据库并加载本地schema:
heroku run rake db:schema:load注意:这个操作会清空Heroku上的所有数据,重新建表,所以只适合测试环境,或者你已经把数据备份好的生产环境!
以后别再踩这个坑啦
- 合并分支的时候一定要仔细检查迁移文件,别漏了像创建表这么重要的迁移。
- 尽量别随便删迁移文件,真要清理迁移历史的话,本地跑
rails db:migrate:reset后,把更新后的schema.rb提交上去,然后让团队所有人都用db:schema:load来同步数据库,别各自跑迁移。
内容的提问来源于stack exchange,提问作者JoeyMousepad
相关产品推荐
相关产品推荐

