Rails 5-PostgreSQL:如何移除已销毁表对应列与索引的迁移文件
解决已删除数据表后残留迁移文件的部署问题
我懂你现在的糟心状况——已经把Location脚手架和对应数据表都清掉了,结果忘了处理之前加slug列的迁移文件,导致Heroku部署直接卡壳。别慌,按下面的步骤一步步来就能搞定:
第一步:清理本地数据库Schema
因为Location表已经不存在了,直接回滚那个迁移肯定会报错。先找到项目里的db/schema.rb文件,手动删掉和locations表slug列、索引相关的代码:
- 定位到
create_table "locations"代码块,删掉里面的t.string "slug"行 - 找到下方的
add_index "locations", ["slug"], name: "index_locations_on_slug"行,同样删掉
保存修改后的schema.rb文件。
第二步:删除残留的迁移文件
进入项目的db/migrate目录,找到文件名类似[时间戳]_add_slug_to_locations.rb的迁移文件,直接删除它就好。
第三步:同步Heroku的迁移状态
Heroku的数据库里可能还记录着这个迁移已经执行过(状态为up),但对应的表已经消失了,所以得把这条无效记录删掉:
- 先查看迁移状态,确认目标迁移的版本号:
找到heroku run rails db:migrate:statusAddSlugToLocations对应的那一行,前面的数字就是版本号(也就是迁移文件名开头的那串时间戳)。 - 打开Heroku的Rails控制台:
heroku run rails console - 在控制台里执行SQL语句删除这条记录:
把ActiveRecord::Base.connection.execute("DELETE FROM schema_migrations WHERE version = '你的迁移版本号'")你的迁移版本号替换成刚才查到的数字,比如20240520123456。
第四步:重新部署到Heroku
把刚才的修改提交到Git,再推送到Heroku:
git add db/schema.rb git commit -m "清理残留的AddSlugToLocations迁移及Schema内容" git push heroku main
小提醒
操作Heroku数据库前,最好先做个备份以防万一:
heroku pg:backups:capture
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

