Rails应用部署Heroku后出现PG::UndefinedTable错误(quotes表不存在)
我来帮你一步步排查这个Heroku上Rails应用的问题,从错误日志来看,核心问题是Heroku的PostgreSQL数据库里不存在quotes表,虽然你执行了迁移命令,但肯定有环节出了问题,我们逐一排查:
1. 先确认迁移文件已经推送到Heroku
有时候本地创建了迁移文件,但忘了提交到Git或者推送到Heroku,导致Heroku上根本没有这个迁移文件,自然不会创建表。
执行下面的命令检查本地是否已经提交了迁移文件:
git log --oneline | grep create_quotes
如果能看到类似abc123 Add create_quotes migration的记录,再确认已经推送到Heroku:
git push heroku main # 如果你的主分支是master就用master
如果没提交的话,先完成提交和推送:
git add db/migrate/20180527063820_create_quotes.rb git commit -m "Add migration to create quotes table" git push heroku main
2. 重新执行迁移并查看详细日志
有时候迁移命令看起来没报错,但实际执行过程中出了问题,我们重新执行迁移并查看具体日志:
heroku run rake db:migrate
然后查看迁移的执行日志,确认是否有创建quotes表的记录:
heroku logs --ps run
在日志里找类似CREATE TABLE quotes ("id" serial primary key, ...)的语句,如果找不到,说明迁移没有真正执行成功,可能是权限或者其他配置问题。
3. 彻底重置数据库并重新迁移
如果上面的步骤都没问题,那尝试彻底清空Heroku的数据库,然后重新执行迁移:
# 替换YOUR_APP_NAME为你的Heroku应用名称 heroku pg:reset DATABASE --confirm YOUR_APP_NAME heroku run rake db:migrate
⚠️ 注意:这个操作会清空数据库里的所有数据,执行前请确认数据可以丢失。
4. 检查Heroku的环境配置
有时候可能不小心设置了错误的RAILS_ENV,导致迁移跑在了错误的环境里,确认一下:
heroku config:get RAILS_ENV
如果输出不是production,设置为production环境:
heroku config:set RAILS_ENV=production
然后重新执行迁移。
额外小提示(不影响当前错误,但建议修复)
看你的quotes_controller.rb的index方法里,有一段代码:
if @quote && @quote.image_url.blank? @quote.image_url = get_flickr_image_url(@quote) @quote.save end
这里的@quote变量在index方法里并没有定义(你定义的是复数的@quotes),所以这段代码永远不会执行,建议删掉或者修正,避免后续可能出现的奇怪问题。
内容的提问来源于stack exchange,提问作者That dude

