[英]How do i roll back this rails migration?
我運行了下面的遷移,但忘記包含我想要的默認值。 我正在嘗試回滾它,以便我可以添加默認值並再次向前滾動。
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 都失敗並出現以下錯誤
$導軌數據庫:回滾
== 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不支持刪除列,而您必須這樣做(請參閱 SQLite 常見問題或如何在 SQLITE 中刪除或添加列? ):
ActiveRecord 在幕后為您執行此操作。 步驟 (3) 是出現問題的地方,因為您無法刪除被外鍵約束引用的表。 我認為您將手動處理外鍵:首先使用單獨的up
和down
方法,然后將down
方法修改為:
remove_foreign_key
。remove_column :skill_levels, :cooldown
就像你現在一樣。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 支持外鍵約束之前。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.