Rails项目中PostgreSQL出现PG::UndefinedTable错误:relation 'links'不存在问题求助
我之前在Rails项目里也碰到过几乎一模一样的PostgreSQL迁移问题,给你几个实用的排查和解决方向:
先确认迁移状态
运行rails db:migrate:status命令,这个命令会列出所有迁移文件的状态(up表示已执行,down表示未执行)。重点看最近执行的几个迁移,有没有某个迁移的操作导致links表被删除,或者负责创建links表的迁移意外被标记为down了。检查最近的迁移文件
打开你最近编写或执行的迁移文件,仔细查看有没有drop_table :links、rename_table这类会改动links表的代码,或者有没有条件判断逻辑写崩了,导致表被意外删除。比如有些同学会写if table_exists?但判断条件写错,反而触发了删除操作。尝试回滚可疑迁移
如果发现某个迁移是问题根源,用rails db:rollback STEP=2(把2换成你需要回滚的迁移步数)回滚到之前正常的状态,然后重新执行迁移rails db:migrate,看看服务器能不能正常启动。直接检查数据库中的表
进入PostgreSQL控制台(运行psql 你的数据库名,开发环境一般是your_app_development),然后输入\d links查看表是否存在。如果显示relation "links" does not exist,那说明表确实被删了;如果表存在,那要检查是不是Rails连接的数据库环境不对(比如不小心连到测试库了)。恢复表的方案(分环境)
- 开发环境:如果没有重要数据,可以直接运行
rails db:reset,这个命令会清空数据库,重新加载schema.rb里的表结构,然后加载种子数据。或者用rails db:schema:load直接从schema重建表结构。 - 生产环境:绝对不能随便用reset或schema load!先立刻备份当前数据库,然后排查迁移文件中的问题,或者从最近的数据库备份中恢复
links表的数据。
- 开发环境:如果没有重要数据,可以直接运行
如果这些方法都没解决问题,可以把rails db:migrate:status的输出结果,或者最近几个迁移文件的代码贴出来,这样能更快定位到问题所在。
内容的提问来源于stack exchange,提问作者diego

