次の移行ファイルがあります 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
STEP=-1
。私は一度それをしました、そしてそれはすべてをロールバックして、怒りました よくない!これはRails 4.2でした-今では修正されていると思います。
rake db:migrate:down VERSION=20100905201547
特定のファイルをロールバックします。
すべての移行のバージョンを確認するには、次のコマンドを使用できます。
rake db:migrate:status
または、マイグレーションのファイル名のプレフィックスは、ロールバックする必要があるバージョンです。
移行については、Ruby on Railsガイドのエントリをご覧ください。
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
rake db:migrate:status
最後の移行をロールバックしています:
# 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
特定のバージョン(など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
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によって処理されます。
Rails 5では、レーキdb:migrate:statusまたはrails db:migrate:statusは非常に簡単です。
両方を同じように処理するように変更されました。次に、ロールバックするバージョンを選択して、rake db:migrate VERSION = 2013424230423を実行します。
VERSIONがすべて大文字であることを確認してください
移行のステップで問題が発生した場合、または途中で動かなくなった場合は、移行ファイルに移動して、既に移行された行をコメント化してください。
それが役に立てば幸い
Class.down
stackoverflow.com/questions/753919/run-a-single-migration-file