特定のマイグレーションをロールバックする方法は?

次のマイグレーションファイルがある dbmigrate_20100905201547_create_blocks.rb.

そのマイグレーションファイルを具体的にロールバックするにはどうすればよいですか?

質問へのコメント (3)
ソリューション
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つだけを再実行し、それまでロールバックされていなかった他のものをスキップすることができます。

解説 (7)
rake db:migrate:down VERSION=20100905201547

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


すべてのマイグレーションのバージョンを調べるには、次のコマンドを使用します。

rake db:migrate:status

または、単純にマイグレーション'のファイル名の接頭辞がロールバックする必要のあるバージョンです。


migrationsについては、Ruby on Railsガイドのエントリを参照してください。

解説 (10)

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

rake db:rollback

特定のマイグレーションをバージョンでロールバックしたい場合は、以下のようにします。

rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION

例えば バージョンが20141201122027であれば、あなたはそうします。

rake db:migrate:down VERSION=20141201122027

を使用して、その特定のマイグレーションをロールバックします。

解説 (0)

マイグレーションをロールバックするには、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)

rake db:migrate:down VERSION=your_migrations's_version_number_here のようになります。

バージョンは、マイグレーションのファイル名の接頭辞の数字です。

バージョンの見つけ方.

移行ファイルは rails_root/db/migrate ディレクトリに保存されています。 ロールバックしたいファイルを探して、プレフィックス番号をコピーしてください。

例えば

ファイル名を指定します。 20140208031131_create_roles.rb とすると、バージョンは 20140208031131 です。

解説 (1)

前回のマイグレーションをロールバック。

# 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
解説 (0)

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

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
解説 (0)

もしそれが可逆的なマイグレーションで、最後に実行されたものであれば、rake db:rollbackを実行します。 そして、常にバージョンを使用することができます。 例えば

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

解説 (0)

Railsガイド](http://edgeguides.rubyonrails.org/active_record_migrations.html#reverting-previous-migrations)より

前の移行を元に戻す

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 validationsを使用するのが最善であると判断された場合を想像してみましょう。


    class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
      def change
        revert do
          # copy-pasted code from CreateBlock
          reversible do |dir|
            dir.up do
              # add a CHECK constraint
              execute 
解説 (0)

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

$ bundle exec rake db:migrate

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

  $ bundle exec rake db:rollback

最初にさかのぼっていくには

  $ bundle exec rake db:migrate VERSION=0

お察しの通り、他の数字を 0 に置き換えると、そのバージョン番号に移行します。

解説 (0)

特定のバージョンまでのすべての移行をロールバックするには** (例: 2018100222222222) (例: 2018100222222222) を使用します。

rake db:migrate VERSION=20181002222222

(この質問に対する他の回答にあるような db:migrate:down ではなく、db:migrate を使うことに注意してください)。

指定されたマイグレーションのバージョンが現在のバージョンよりも古いと仮定すると、指定されたバージョンまでのすべてのマイグレーションをロールバックします。

例えば、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

解説 (0)

まあ、レール5では簡単です。 rake db:migrate:status 或いは rails db:migrate:status

両方を同じように扱うように修正されています そして、ロールバックしたいバージョンを選択してください。 を実行して rake db:migrate VERSION=2013424230423

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

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

お役に立てれば幸いです。

解説 (1)

ロールバックして移行したい場合は実行します。

rake db:migrate:redo

と同じですね。

rake db:rollback
rake db:migrate
解説 (0)