gpt4 book ai didi

ruby-on-rails - 如何回滚Rails迁移?

转载 作者:行者123 更新时间:2023-12-03 17:51:31 25 4
gpt4 key购买 nike

我运行了以下迁移,却忘了包含我想要的默认值。我正在尝试将其回滚,以便可以添加默认值并再次将其前滚。

20190728151635_add_cooldown_to_skill_levels.rb

class AddCooldownToSkillLevels < ActiveRecord::Migration[5.1]
def change
add_column :skill_levels, :cooldown, :integer
end
end


所有rails db:migrate和db:rollbacks均失败,并显示以下错误

$ rails db:rollback

== 20190728151635 AddCooldownToSkillLevels: reverting =========================
-- remove_column(:skill_levels, :cooldown, :integer)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::ConstraintException: FOREIGN KEY constraint failed: DROP TABLE "skill_levels"



And 100+ more lines ...


我尝试将迁移更改为无显式上/下方法

class AddCooldownToSkillLevels < ActiveRecord::Migration[5.1]
def up
add_column :skill_levels, :cooldown, :integer
end

def down
remove_column :skill_levels, :cooldown
end
end


我尝试添加仅添加默认值的新迁移。

20190728153208_add_default_value_to_cooldown_on_skill_levels.rb

class AddDefaultValueToCooldownOnSkillLevels < ActiveRecord::Migration[5.1]
def change
change_column_default :skill_levels, :cooldown, 1
end
end


类似错误
$ rails db:migrate

== 20190728153208 AddDefaultValueToCooldownOnSkillLevels: migrating ===========
-- change_column_default(:skill_levels, :cooldown, 1)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::ConstraintException: FOREIGN KEY constraint failed: DROP TABLE "skill_levels"

And 100+ more lines ...


我很愿意直接在SQL中修复它,但是我试图保持我的迁移完好无损。

编辑:添加$ rails db:migrate:status的输出

...
up 20190727160901 Create skill levels
up 20190728004535 Create skill effects
up 20190728151635 Add cooldown to skill levels
down 20190728153208 Add default value to cooldown on skill levels


感谢你的帮助。

最佳答案

错误:

FOREIGN KEY constraint failed: DROP TABLE "skill_levels" 


告诉您存在一个引用您的 skill_levels表(即其他迁移中的 t.references :skill_levels, foreign_key: true)的外键约束,而 remove_column :skill_levels, :cooldown导致此问题。

但是,为什么在ALTER TABLE删除列期间出现数据库约束问题?好吧,SQLite的ALTER TABLE doesn't support removing a column,相反,您必须(请参阅SQLite FAQ或 How to delete or add column in SQLITE?):


创建一个没有要删除的列的新表。
将数据复制到新表。
放下原稿。
重命名副本。


ActiveRecord为您在后台执行此操作。步骤(3)出了问题,因为您无法删除外键约束所引用的表。我认为您将可以手动处理外键:首先使用单独的 updown方法,然后将 down方法修改为:


删除引用表的所有外键,一旦知道要处理的FK,就可以使用 remove_foreign_key
然后像现在一样 remove_column :skill_levels, :cooldown
最后放回所有FK,您可以使用 add_foreign_key


就像是:

def down
remove_foreign_key :some_table, :skill_levels
remove_column :skill_levels, :cooldown
add_foreign_key :some_table, :skill_levels
end


理想情况下,ActiveRecord会为您解决此问题,但是大概AR的SQLite支持主要来自于AR支持外键约束之前。

关于ruby-on-rails - 如何回滚Rails迁移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57242929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com