次の移行ファイルがありますdb\migrate\20100905201547_create_blocks.rb
その移行ファイルを具体的にロールバックする方法を教えてください。
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つだけを再実行します。
rake db:migrate:down VERSION=20100905201547
特定のファイルをロールバックします。
すべての移行のバージョンを確認するには、次のコマンドを使用できます。
rake db:migrate:status
または、単に移行のファイル名のプレフィックスがロールバックに必要なバージョンです。
Ruby on Railsガイドのエントリ マイグレーションについてを参照してください。
最後のマイグレーションをロールバックするには、次のようにします。
rake db:rollback
特定のバージョンの移行をロールバックしたい場合は、次のようにします。
rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION
例えばバージョンが20141201122027の場合は、次のようにします。
rake db:migrate:down VERSION=20141201122027
その特定の移行をロールバックします。
rake db:rollback
をさまざまなオプションで使用することで、移行をロールバックできます。必要に応じて構文は異なります。
最後のマイグレーションだけをロールバックしたい場合は、どちらかを使用できます。
rake db:rollback
または
rake db:rollback STEP=1
一度にロールバック数の移行をしたい場合は、単純に引数を渡します。
rake db:rollback STEP=n
n
は、ロールバックするマイグレーションの数で、最新のマイグレーションから数えます。
特定の移行にロールバックする場合は、次のバージョンで移行のバージョンを渡す必要があります。
rake db:migrate:down VERSION=xxxxx
xxxxxは移行のバージョン番号です。
rake db:migrate:down VERSION=your_migrations's_version_number_here
バージョンは、移行のファイル名の数字の接頭辞です。
バージョンの見つけ方 :
移行ファイルはRails_root/db/migrate
ディレクトリに保存されています。ロールバック先の適切なファイルを見つけて、プレフィックス番号をコピーします。
例えば
ファイル名:20140208031131_create_roles.rb
、バージョンは20140208031131
最後のマイグレーションをロールバックします。
# 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
最後のマイグレーションをロールバックするには、次のようにします。
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
それが可逆的な移行であり、最後に実行されたものである場合は、rake db:rollback
を実行します。そして、あなたはいつもバージョンを使うことができます。例えば
移行ファイルは20140716084539_create_customer_stats.rbなので、ロールバックコマンドはrake db:migrate:down VERSION=20140716084539
になります。
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に置き換え、最後に上下に置き換えます。これはすべて元に戻すことによって処理されます。
マイグレーションはコマンドを使用してデータベースの状態を変更します
$ bundle exec rake db:migrate
次のようにして、単一の移行手順を元に戻すことができます。
$ bundle exec rake db:rollback
ずっと最初に戻るために、私達は使用できます
$ bundle exec rake db:migrate VERSION=0
ご想像のとおり、0に他の番号を代入すると、そのバージョン番号に移行します。バージョン番号は、移行を順番にリストしたものです。
Rails 5では、db:migrate:statusまたはrails db:migrate:statusという非常に簡単な方法です。
それは両方の同じ方法を扱うために修正されましたそれからちょうどあなたがロールバックしたいと思うバージョンを選択してからrake dbを実行してください:migrate VERSION = 2013424230423
VERSIONがすべて大文字であることを確認してください
あなたが移行のいずれかのステップで問題を抱えているか、途中で立ち往生している場合は、単に移行ファイルに行き、すでに移行された行をコメントアウトしてください。
それが役立つことを願っています
特定のバージョンまでのすべての移行をロールバックするには (例: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
ロールバックして移行したい場合は、次のコマンドを実行してください。
rake db:migrate:redo
それはと同じです:
rake db:rollback
rake db:migrate