无法回滚数据库迁移:缺失文件致ActiveRecord错误如何解决?
解决ActiveRecord::UnknownMigrationVersionError问题
问题根源
你的数据库schema_migrations表中仍保留着版本号20221220155010的记录,但对应的create_dogs.rb迁移文件已经随废弃的add_dogs分支被删除,导致Rails回滚时找不到匹配的迁移文件。
解决方案
方案一:直接清理数据库残留记录(最快方式)
- 启动Rails控制台:
rails console - 执行SQL删除对应版本记录:
ActiveRecord::Base.connection.execute("DELETE FROM schema_migrations WHERE version = '20221220155010'") - 退出控制台后,重新运行
rails db:rollback即可正常回滚add_cats分支的迁移。
方案二:临时恢复迁移文件再回滚(更合规的做法)
如果不想直接操作数据库,可以通过Git临时恢复迁移文件完成回滚:
- 查找创建该迁移的Git提交哈希:
git log --all --grep="create_dogs" - 从提交中导出迁移文件到当前分支:
git show <提交哈希>:db/migrate/20221220155010_create_dogs.rb > db/migrate/20221220155010_create_dogs.rb - 回滚指定步数(包含临时恢复的迁移和
add_cats的迁移):
(注:如果rails db:rollback STEP=2add_cats分支只有一个迁移,STEP=2即可;如果有多个,根据实际迁移数量调整) - 删除临时恢复的迁移文件:
rm db/migrate/20221220155010_create_dogs.rb - 之后
db:rollback和db:migrate:redo就能正常使用了。
后续注意事项
- 执行迁移后要废弃分支时,先在该分支运行
db:rollback再删除分支,避免数据库残留迁移记录。 - 团队协作场景下,新环境初始化推荐使用
rails db:schema:load替代db:migrate,确保schema和数据库状态一致。
内容的提问来源于stack exchange,提问作者David Hempy
相关产品推荐
相关产品推荐

