web-dev-qa-db-ja.com

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

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

その移行ファイルを具体的にロールバックする方法を教えてください。

706
AnApprentice
rake db:rollback STEP=1

ロールバックするマイグレーションが最後に適用されたマイグレーションである場合は、これを行う方法です。あなたが戻って行きたいけれども多くの移行のために1を代用することができます。

例えば:

rake db:rollback STEP=5

また、後で発生したすべての移行(4、3、2、さらには1)もロールバックされます。

すべてのマイグレーションをターゲットマイグレーションにロールバックする(およびそれを含む)には、次のコマンドを使用します。

rake db:migrate VERSION=20100905201547

特定のマイグレーションのみ(アウトオブオーダー)をロールバックするには、次のコマンドを使用します。

rake db:migrate:down VERSION=20100905201547

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

1127
Zachary Wright
rake db:migrate:down VERSION=20100905201547

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


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

rake db:migrate:status

または、単に移行のファイル名のプレフィックスがロールバックに必要なバージョンです。


Ruby on Railsガイドのエントリ マイグレーションについてを参照してください。

826
John Creamer

最後のマイグレーションをロールバックするには、次のようにします。

rake db:rollback

特定のバージョンの移行をロールバックしたい場合は、次のようにします。

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

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

rake db:migrate:down VERSION=20141201122027

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

47
Waleed

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

最後のマイグレーションだけをロールバックしたい場合は、どちらかを使用できます。

rake db:rollback

または

rake db:rollback STEP=1

一度にロールバック数の移行をしたい場合は、単純に引数を渡します。

rake db:rollback STEP=n

nは、ロールバックするマイグレーションの数で、最新のマイグレーションから数えます。

特定の移行にロールバックする場合は、次のバージョンで移行のバージョンを渡す必要があります。

rake db:migrate:down VERSION=xxxxx

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

24
uma

rake db:migrate:down VERSION=your_migrations's_version_number_here

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

バージョンの見つけ方

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

例えば

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

24
Hardik

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

# 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
13
Deepak Mahakale

最後のマイグレーションをロールバックするには、次のようにします。

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
13
Sandip Vavhal

それが可逆的な移行であり、最後に実行されたものである場合は、rake db:rollbackを実行します。そして、あなたはいつもバージョンを使うことができます。例えば

移行ファイルは20140716084539_create_customer_stats.rbなので、ロールバックコマンドはrake db:migrate:down VERSION=20140716084539になります。

6
Santanu

From レールガイド

以前の移行を元に戻す

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制約の代わりにActive Record検証を使用するのが最善の方法であると後で判断するとしましょう。

    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とリバーシブルの順序を逆にし、create_tableをdrop_tableに置き換え、最後に上下に置き換えます。これはすべて元に戻すことによって処理されます。

3

マイグレーションはコマンドを使用してデータベースの状態を変更します

$ bundle exec rake db:migrate

次のようにして、単一の移行手順を元に戻すことができます。

  $ bundle exec rake db:rollback

ずっと最初に戻るために、私達は使用できます

  $ bundle exec rake db:migrate VERSION=0

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

3
Nirupa

Rails 5では、db:migrate:statusまたはrails db:migrate:statusという非常に簡単な方法です。

それは両方の同じ方法を扱うために修正されましたそれからちょうどあなたがロールバックしたいと思うバージョンを選択してからrake dbを実行してください:migrate VERSION = 2013424230423

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

あなたが移行のいずれかのステップで問題を抱えているか、途中で立ち往生している場合は、単に移行ファイルに行き、すでに移行された行をコメントアウトしてください。

それが役立つことを願っています

2
Shahin

特定のバージョンまでのすべての移行をロールバックするには (例: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

2
Jon Schneider

ロールバックして移行したい場合は、次のコマンドを実行してください。

rake db:migrate:redo

それはと同じです:

rake db:rollback
rake db:migrate
1
Iwan B.