[英]I can't rollback migrations, because the migration file does not exist
我在分支“add_dogs”中添加了遷移db/migrate/20221220155010_create_dogs.rb
,並運行了db:migrate
。
后來,我改變了分支(沒有合並),最終放棄了“new_dogs”分支。
后來,我用db/migrate/20221101010101_create_cats.rb
檢查了“add_cats”分支,然后運行了db:migrate
。 到目前為止,一切都很好。
但隨后我調整了“add_cats”遷移(在提交任何內容之前),並運行了db:rollback
以便我可以再次運行它。 我收到此錯誤:
ActiveRecord::UnknownMigrationVersionError:
No migration with version number 20221220155010.
我仍然可以在新遷移上運行db:migrate
就好了,但不能運行db:rollback
或db:migrate:redo
。
這是有道理的,因為數據庫有申請20221220155010
的記錄,但是那個遷移文件已經不存在了,所以沒有辦法回滾。
我怎樣才能克服這個問題?
以下是處理丟失的遷移文件的三種方法,具體取決於您的需要和訪問權限:
rake db:migrate:down VERSION=20230101010101
// This is the version of the migration you WANT to rollback, not the missing one.
DELETE FROM schema_migrations WHERE version = '20221220155010'
-- This is the version of the migration that is MISSING, not the one you are working on.
創建一個名為db/migrations/20221220155010_just_kidding.rb
的文件:
class JustKidding < ActiveRecord::Migration
def change
# nothing to see here.
end
end
然后, rails db:rollback
將回滾該無操作遷移並從 schema_migrations 表中刪除20221220155010
。 您現在可以永遠刪除安慰劑遷移,就運行遷移和回滾而言,您將處於良好狀態。
但是...不要忘記舊遷移的影響仍在您的架構中。 也許你被一個新的、未使用的“狗”表或表上的額外列所困擾。 也許這對您的開發箱來說是良性的,但您肯定不希望在生產環境中出現這種情況。 此答案中的所有建議都假設您處於一次性環境中,並且舊遷移的影響不是問題。 在這種情況下,拆除整個數據庫並重建可能會成為一個更有吸引力的選擇。
這里真正的要點之一是……首先不要讓這種情況發生! 理想情況下,您應該在離開分支之前回滾任何新的、未提交的遷移。 但是……事情發生了……
ps 如果有辦法從命令行執行此操作,我很樂意學習。 我在想像rails db:migrate:delete VERSION=20230101010101
的東西可能會以一種駭人聽聞的方式派上用場。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.