无法回滚Rails迁移:AddVisibleToStocks回滚触发SQLite外键约束异常
解决Rails迁移回滚时SQLite外键约束报错问题
这个报错是典型的SQLite外键约束拦截问题——当SQLite启用了外键检查时,即使你要删除的visible不是外键字段,回滚时执行remove_column操作也会触发数据库的外键验证,最终导致约束异常。下面给你几个可行的解决办法:
方法一:临时禁用外键后再回滚
先打开Rails控制台(执行rails c),运行以下命令关闭外键约束:
ActiveRecord::Base.connection.execute("PRAGMA foreign_keys = OFF")
退出控制台后执行回滚命令:
rake db:rollback
回滚完成后,记得再打开控制台重新启用外键约束,避免后续操作出现数据一致性问题:
ActiveRecord::Base.connection.execute("PRAGMA foreign_keys = ON")
方法二:修改迁移文件,手动处理外键约束
把原来的change方法改成up和down分离的写法,在回滚(down)阶段临时禁用外键,删除字段后再恢复:
class AddVisibleToStocks < ActiveRecord::Migration[5.2] def up add_column :stocks, :visible, :boolean end def down # 临时关闭外键约束 ActiveRecord::Base.connection.execute("PRAGMA foreign_keys = OFF") remove_column :stocks, :visible, :boolean # 重新开启外键约束 ActiveRecord::Base.connection.execute("PRAGMA foreign_keys = ON") end end
修改后直接执行rake db:rollback就能正常完成回滚了。
补充说明
这个问题只在SQLite环境下容易出现,PostgreSQL或MySQL对这类表结构变更的外键检查更宽松。如果你的项目是用SQLite做开发环境数据库,建议以后遇到类似的表结构变更回滚问题,都可以用上面的方法绕过外键约束拦截。
内容的提问来源于stack exchange,提问作者Kim K
相关产品推荐
相关产品推荐

