特定の移行をロールバックする方法は?


807

次の移行ファイルがあります db\migrate\20100905201547_create_blocks.rb

その移行ファイルを具体的にどのようにロールバックできますか?


1
これで問題は解決しましたか?あなただけ行う必要がありますClass.down stackoverflow.com/questions/753919/run-a-single-migration-file
danivovich

4
移行に関するすべての情報はこちら
Nishutosh Sharma 2013

1
その単一の特定の移行のみをロールバックしますか(その後に続く新しい移行がある場合でも)?または、データベースを、その移行およびそれ以降の移行が適用される前の状態にロールバックしますか?
Jon Schneider、

回答:


1340
rake db:rollback STEP=1

これを行う方法です。ロールバックする移行が最後に適用されたものである場合。元に戻したいマイグレーションの数を1に置き換えることができます。

例えば:

rake db:rollback STEP=5

後で発生したすべての移行もロールバックします(4、3、2、および1)。

すべての移行をターゲットの移行にロールバックするには(以下を使用):(この修正されたコマンドは、元の投稿のエラーを指摘するすべてのコメントの後に追加されました)

rake db:migrate VERSION=20100905201547

1つだけの特定の移行(順不同)をロールバックするには、以下を使用します。

rake db:migrate:down VERSION=20100905201547

これは、途中の移行をロールバックしないことに注意してください-リストされたものだけです。それが意図したものではない場合は、安全に実行できrake db:migrate、そのロールのみが再実行され、以前にロールバックされていなかった他はスキップされます。

また、1つの移行を順不同で移行したい場合は、その逆もありますdb:migrate:up

rake db:migrate:up VERSION=20100905201547

14
「特定のバージョンにロールバックするには」-特定の移行にロールバックするのではなく、特定の移行のみをロールバックするコマンドではありませんか?
Andrew Grimm

10
「特定のバージョンの使用にロールバックするには...」 この答えは正しくありません。これは、他の回答で説明されているように、移行を分離してロールバックします。
Rhys van der Waerden、2016年

3
警告:私はこの間違いを犯しました。rakedb:migrate:down VERSION = 20100905201547のみを使用して、分離してロールバックしてください!!! 1つの移行ファイル。これは上のコメントで言及されていますが、見逃しました。
pixelearth 2017年

3
警告の別の言葉-絶対にしないでくださいSTEP=-1。私は一度それをしました、そしてそれはすべてをロールバックして、怒りました よくない!これはRails 4.2でした-今では修正されていると思います。
デイブハートノール2018年

1
これらのコマンドをいつどのように使用するかを説明する、マイグレーションに関する私のブログの記事を書きました:railsguides.net/polish-rails-migrations
ka8725

867
rake db:migrate:down VERSION=20100905201547

特定のファイルをロールバックします。


すべての移行のバージョンを確認するには、次のコマンドを使用できます。

rake db:migrate:status

または、マイグレーションのファイル名のプレフィックスは、ロールバックする必要があるバージョンです。


移行については、Ruby on Railsガイドのエントリをご覧ください。


48
私の意見では間違いなく好ましい答えです。
streetlogics 2013

30
特定の移行をロールバックし、今後のRakeタスクでの再移行を望まない場合は、移行ファイルも削除することに注意してください。
BradGreens 2013

4
注:アップマイグレーションが成功せず、部分的にしか実行されていない場合、ダウンマイグレーションは何もしないようです。
シリルチャンピア2013年

1
@nerith、それはおそらくトランザクションDDLをサポートしないデータベースにのみ当てはまります。MySQLはトランザクションDDLをサポートしていません:dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html PostreSQLはサポートしてい ます:wiki.postgresql.org/wiki/…したがって、MySQLデータベースでの移行が失敗した場合次に、成功した移行の一部を手動で削除する必要があります。
ИванБишевац

1
@BradGreensコメントに関する別の観察。移行ファイルを削除する必要があり、すでにデプロイされている場合は、削除したファイルでコードをコミットする前に、本番環境/ステージングをロールバックする必要があります。そうしないと、ロールバック/移行:ダウンできなくなります。
AdamT 2017

57

最後の移行をロールバックするには、次のようにします。

rake db:rollback

特定のマイグレーションをバージョンでロールバックしたい場合は、次のようにする必要があります。

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

たとえば、バージョンが20141201122027の場合、次のようにします。

rake db:migrate:down VERSION=20141201122027

特定の移行をロールバックします。


32

rake db:rollbackさまざまなオプションを使用して移行をロールバックできます。構文は、要件に応じて異なります。

最後の移行のみをロールバックする場合は、次のいずれかを使用できます

rake db:rollback

または

rake db:rollback STEP=1

マイグレーションの数を一度にロールバックしたい場合は、引数を渡すだけです。

rake db:rollback STEP=n

どこnのロールバックへの移行の数は、最新の移行から数えて、です。

特定のマイグレーションにロールバックしたい場合は、以下のマイグレーションのバージョンを渡す必要があります。

rake db:migrate:down VERSION=xxxxx

ここで、xxxxxは移行のバージョン番号です。


1
:downの追加は機能しませんが、正しい答えはdownなしです
Elta3lab

26

rake db:migrate:down VERSION=your_migrations's_version_number_here

バージョンは、移行のファイル名の数字の接頭辞です

バージョンを見つける方法

移行ファイルはrails_root/db/migrateディレクトリに保存されます。ロールバックする適切なファイルを見つけ、プレフィックス番号をコピーします。

例えば

ファイル名:20140208031131_create_roles.rb バージョンは20140208031131


6
移行IDを見つける最も簡単な方法は、実行することですrake db:migrate:status
Aeradriel

18

最後の移行をロールバックしています:

# rails < 5.0
rake db:rollback

# rails >= 5.0
rake db:rollback
# or
rails db:rollback

最後のn数のマイグレーションをロールバックしています

# rails < 5.0
rake db:rollback STEP=2

# rails >= 5.0
rake db:rollback STEP=2
# or
rails db:rollback STEP=2

特定の移行をロールバックする

# rails < 5.0
rake db:migrate:down VERSION=20100905201547

# rails >= 5.0
rake db:migrate:down VERSION=20100905201547
# or
rails db:migrate:down VERSION=20100905201547

14

最後の移行をロールバックするには、次のようにします。

rake db:rollback

特定のマイグレーションをバージョンでロールバックしたい場合は、次のようにする必要があります。

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

ロールバックする移行ファイルが呼び出された場合、その移行db/migrate/20141201122027_create_some_table.rbのVERSIONは20141201122027であり、これはその移行が作成されたときのタイムスタンプであり、その移行をロールバックするコマンドは次のようになります。

rake db:migrate:down VERSION=20141201122027

6

元に戻せる移行であり、最後に実行されたものである場合は、を実行しrake db:rollbackます。そして、いつでもバージョンを使用できます。例えば

移行ファイルは20140716084539_create_customer_stats.rbなので、rollbackコマンドは次のようになります。 rake db:migrate:down VERSION=20140716084539


6

特定のバージョン(など20181002222222までのすべての移行をロールバックするには、次のコマンドを使用します。

rake db:migrate VERSION=20181002222222

(これが使用することに注意してくださいdb:migrate- db:migrate:downこの質問に対する他の回答とは異なります。)

指定された移行バージョンが現在のバージョンより古いと仮定すると、これにより、指定されたバージョンまでのすべての移行がロールバックされます(指定されたバージョンは含まれません)。

たとえば、rake db:migrate:status最初に次のように表示されたとします。

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  up      20181003171932  Some migration description
  up      20181004211151  Some migration description
  up      20181005151403  Some migration description

ランニング:

rake db:migrate VERSION=20181002222222

結果は:

  (... some older migrations ...)
  up      20181001002039  Some migration description
  up      20181002222222  Some migration description
  down    20181003171932  Some migration description
  down    20181004211151  Some migration description
  down    20181005151403  Some migration description

リファレンス:https : //makandracards.com/makandra/845-migrate-or-revert-only-some-migrations


4

Railsガイドから

以前の移行を元に戻す

Active Recordの機能を使用して、次のrevert方法で移行をロールバックできます。

require_relative '20100905201547_create_blocks'

class FixupCreateBlock < ActiveRecord::Migration
  def change
    revert CreateBlock

    create_table(:apples) do |t|
      t.string :variety
    end
  end
end

このrevertメソッドは、逆にする命令のブロックも受け入れます。これは、以前の移行の選択した部分を元に戻すのに役立ちます。たとえば、CreateBlockがコミットされ、後でCHECK制約の代わりにアクティブレコード検証を使用して郵便番号を検証するのが最善であると判断されたとします。

    class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
      def change
        revert do
          # copy-pasted code from CreateBlock
          reversible do |dir|
            dir.up do
              # add a CHECK constraint
              execute <<-SQL
                ALTER TABLE distributors
                  ADD CONSTRAINT zipchk
                    CHECK (char_length(zipcode) = 5);
              SQL
            end
            dir.down do
              execute <<-SQL
                ALTER TABLE distributors
                  DROP CONSTRAINT zipchk
              SQL
            end
          end

          # The rest of the migration was ok
        end
      end
    end

同じ移行はrevertを使用せずに作成することもできますが、これにはいくつかの手順が含まれます。create_tableとreversibleの順序を逆にし、create_tableをdrop_tableに置き換え、最後にupをdownに、またはその逆に置き換えます。これはすべてrevertによって処理されます。


3

移行は、コマンドを使用してデータベースの状態を変更します

$ bundle exec rake db:migrate

を使用して単一の移行ステップを元に戻すことができます

  $ bundle exec rake db:rollback

最初に戻るには、

  $ bundle exec rake db:migrate VERSION=0

ご想像のとおり、0を他の番号に置き換えると、そのバージョン番号に移行します。バージョン番号は、移行を順番にリストしたものです


2

Rails 5では、レーキdb:migrate:statusまたはrails db:migrate:statusは非常に簡単です。

両方を同じように処理するように変更されました。次に、ロールバックするバージョンを選択して、rake db:migrate VERSION = 2013424230423を実行します。

VERSIONがすべて大文字であることを確認してください

移行のステップで問題が発生した場合、または途中で動かなくなった場合は、移行ファイルに移動して、既に移行された行をコメント化してください。

それが役に立てば幸い


1
コマンドrake db:migrate:statusのヒントを強調表示します。。。概要で移行ファイルの現在の実行状態を確認するのは素晴らしいことです。
ビューティー

1

ロールバックして移行する場合は、次のコマンドを実行できます。

rake db:migrate:redo

それは同じです:

rake db:rollback
rake db:migrate
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.