次の移行ファイルがありますdb\migrate\20100905201547_create_blocks.rb
その移行ファイルを具体的にロールバックするにはどうすればよいですか?
次の移行ファイルがあります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
1 つの特定の移行のみをロールバックするには (順不同)、次を使用します。
rake db:migrate:down VERSION=20100905201547
これは、介在する移行をロールバックしないことに注意してください。リストされている移行のみです。それが意図したものでない場合は、安全に実行できますrake db:migrate
。以前にロールバックされていない他のものはスキップして、その 1 つだけが再実行されます。
また、単一の移行を順不同で移行したい場合は、その逆もありますdb:migrate:up
。
rake db:migrate:up VERSION=20100905201547
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
移行は、コマンドを使用してデータベースの状態を変更します
$ bundle exec rake db:migrate
を使用して、単一の移行ステップを元に戻すことができます
$ bundle exec rake db:rollback
最初に戻るには、次を使用できます。
$ bundle exec rake db:migrate VERSION=0
ご想像のとおり、0 を他の番号に置き換えると、そのバージョン番号に移行されます。バージョン番号は、移行を順番にリストしたものです。
Railsガイドより
revert
次のメソッドを使用して、Active Record の移行をロールバックする機能を使用できます。
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 と reversible の順序を逆にし、create_table を drop_table に置き換え、最後に up を down に置き換え、その逆です。これはすべて revert によって処理されます。
Rails 5では、かなり簡単です rake db:migrate:status または rails db:migrate:status
両方を同じ方法で処理するように変更されました次に、ロールバックするバージョンを選択してから rake db:migrate VERSION=2013424230423 を実行します
VERSION がすべて大文字であることを確認してください
移行のいずれかのステップで問題が発生したり、途中で立ち往生したりした場合は、移行ファイルに移動して、既に移行された行をコメントアウトしてください。
それが役立つことを願っています