私のRailsアプリで、1つの移行のみを実行しようとしています。これを行うにはどうすればよいですか?移行の前後に移行を実行したくありません。ありがとう。
rake db:migrate:redo VERSION=xxxxxxx
が、それはdown
を実行してからup
ステップを実行します。これは、一時的にダウンステップをコメントアウトすることと併せて行うことができます。
rake db:migrate:up VERSION=1234567890
同様にrake db:migrate:down
で特定の移行を停止します。 rake -T
を使用して、利用可能なrakeタスクのリストを取得できます。
変更された単一の移行を実行する必要があり、他のすべての移行とは無関係に再実行する必要がありました。コンソールを起動して、これを実行します。
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
さらに便利なことに、これはレーキタスクなどに入れることができます。
rake db:migrate:up VERSION=version_no
特定の移行スクリプトを移行(追加)します
rake db:migrate:down VERSION=version_no
特定の移行スクリプトを削除します
rake db:migrate VERSION=20098252345
それを試してみてください。
上記のkorchによる回答を拡張すると、require
は機能しませんでしたが、load
は機能しました。具体的には、移行ファイルの場合:
class ChangeMinQuantityToRaces < ActiveRecord::Migration
def change
change_column :races, :min_quantity, :integer, :default => 0
end
end
コンソールのタイピングで
> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
> ChangeMinQuantityToRaces.new.change
私のために働いた。
> Race.new.min_quantity # => 0
これはRuby 1.9.3p484(2013-11-22リビジョン43786)[x86_64-linux]およびRails 3.2.13。
rake db:migrate:redo version='xxxx'
Xxxxを引用符で囲むことを忘れないでください。xxxxは移行のタイムスタンプ(または移行ID)です。
を使用して、以前に行った移行のタイムスタンプ(移行ID)を確認できます。
rake db:migrate:status
これと同じ問題に遭遇したため、これに2¢を追加します。
新しいものを作成せずに移行を絶対にやり直したい場合は、次のことができます。
Rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';
そして、Railsは、20150105181157の移行を実行したことを「忘れ」ます。db:migrateを実行すると、再び実行されます。
しかし、これはほとんど常に悪い考えです。理にかなっている1つの例は、開発ブランチがあり、まだ移行を具体化しておらず、開発でそれにいくつかのものを追加したい場合です。ただし、それでも、適切にロールバックして繰り返し再試行できるように、移行を2方向にすることをお勧めします。
コンソールから移行クラスを実行する方法が必要です。移行コードを認識できるとは思えません。
ただし、コメントに示されているように、移行を順番に実行することをお勧めします。つかいます:
rake db:migrate VERSION=##########
スクリプト/コンソールへの移行でコードをコピーして貼り付けますか?
これを非常に簡単に開発できるユーティリティメソッドがあります。多くの移行を作成しないようにするのに役立つことがわかりました。通常、移行が展開されるまで移行を変更します。
http://fullware.net/index.php/2011/05/26/easily-load-Rails-migrations-for-console-execution/
開発でこの手法を使用するのは、移行を大幅に変更するときであり、大量に移行して途中でデータを失いたくありません(特に、時間がかかるレガシーデータをインポートする場合は、再度インポートする必要はありません)。
これは100%のハックであり、実稼働環境でこれを行うことは絶対にお勧めしませんが、トリックはできます。