簡體   English   中英

我無法回滾遷移,因為遷移文件不存在

[英]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:rollbackdb:migrate:redo

這是有道理的,因為數據庫有申請20221220155010的記錄,但是那個遷移文件已經不存在了,所以沒有辦法回滾。

我怎樣才能克服這個問題?

以下是處理丟失的遷移文件的三種方法,具體取決於您的需要和訪問權限:

  1. 對於快速的臨時修復,您可以只回滾當前正在編輯的遷移,以便再次運行它。 如果另一個遷移仍在另一個分支的管道中並且最終將合並,這可能很有用。
    rake db:migrate:down VERSION=20230101010101  
    // This is the version of the migration you WANT to rollback, not the missing one. 
  1. 如果丟失的遷移永遠不會回來,您需要永久修復。 最簡單的方法是從數據庫中刪除該記錄。 您可以從您最喜歡的SQL客戶端、rails 控制台等執行此操作(我想您甚至可以編寫一個遷移來執行此操作,但這似乎非常粗略。)
    DELETE FROM schema_migrations WHERE version = '20221220155010'
    -- This is the version of the migration that is MISSING, not the one you are working on.
  1. 如果您出於某種原因不能直接訪問數據庫,您可以給 Rails 一個安慰劑來回滾。 確保文件名中的時間戳與丟失的遷移版本號相匹配。

創建一個名為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.

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