簡體   English   中英

我如何回滾這個 Rails 遷移?

[英]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 中刪除或添加列? ):

  1. 創建一個沒有您要刪除的列的新表。
  2. 將數據復制到新表中。
  3. 放下原來的。
  4. 重命名副本。

ActiveRecord 在幕后為您執行此操作。 步驟 (3) 是出現問題的地方,因為您無法刪除被外鍵約束引用的表。 我認為您將手動處理外鍵:首先使用單獨的updown方法,然后將down方法修改為:

  1. 刪除所有引用你的表的外鍵,一旦你知道你正在處理什么 FK,你就可以使用remove_foreign_key
  2. 然后remove_column :skill_levels, :cooldown就像你現在一樣。
  3. 最后放回所有 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 支持外鍵約束之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM