web-dev-qa-db-ja.com

移行は1回だけ

私のRailsアプリで、1つの移行のみを実行しようとしています。これを行うにはどうすればよいですか?移行の前後に移行を実行したくありません。ありがとう。

87
Anon

rake db:migrate:redo VERSION=xxxxxxxが、それはdownを実行してからupステップを実行します。これは、一時的にダウンステップをコメントアウトすることと併せて行うことができます。

159
Ryan Bigg
rake db:migrate:up VERSION=1234567890

同様にrake db:migrate:downで特定の移行を停止します。 rake -Tを使用して、利用可能なrakeタスクのリストを取得できます。

69
Shadwell

変更された単一の移行を実行する必要があり、他のすべての移行とは無関係に再実行する必要がありました。コンソールを起動して、これを実行します。

>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down

さらに便利なことに、これはレーキタスクなどに入れることができます。

25
user46519

rake db:migrate:up VERSION=version_no

特定の移行スクリプトを移行(追加)します

rake db:migrate:down VERSION=version_no

特定の移行スクリプトを削除します

11
reshma
rake db:migrate VERSION=20098252345

それを試してみてください。

9
JP Silvashy

上記の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。

3
user2001785
rake db:migrate:redo version='xxxx'   

Xxxxを引用符で囲むことを忘れないでください。xxxxは移行のタイムスタンプ(または移行ID)です。

を使用して、以前に行った移行のタイムスタンプ(移行ID)を確認できます。

rake db:migrate:status    
3
hexinpeter

これと同じ問題に遭遇したため、これに2¢を追加します。

新しいものを作成せずに移行を絶対にやり直したい場合は、次のことができます。

Rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';

そして、Railsは、20150105181157の移行を実行したことを「忘れ」ます。db:migrateを実行すると、再び実行されます。

しかし、これはほとんど常に悪い考えです。理にかなっている1つの例は、開発ブランチがあり、まだ移行を具体化しておらず、開発でそれにいくつかのものを追加したい場合です。ただし、それでも、適切にロールバックして繰り返し再試行できるように、移行を2方向にすることをお勧めします。

2
Ken Simon

コンソールから移行クラスを実行する方法が必要です。移行コードを認識できるとは思えません。

ただし、コメントに示されているように、移行を順番に実行することをお勧めします。つかいます:

rake db:migrate VERSION=##########

スクリプト/コンソールへの移行でコードをコピーして貼り付けますか?

1
Terry G Lorber

これを非常に簡単に開発できるユーティリティメソッドがあります。多くの移行を作成しないようにするのに役立つことがわかりました。通常、移行が展開されるまで移行を変更します。

http://fullware.net/index.php/2011/05/26/easily-load-Rails-migrations-for-console-execution/

1
aceofspades

開発でこの手法を使用するのは、移行を大幅に変更するときであり、大量に移行して途中でデータを失いたくありません(特に、時間がかかるレガシーデータをインポートする場合は、再度インポートする必要はありません)。

これは100%のハックであり、実稼働環境でこれを行うことは絶対にお勧めしませんが、トリックはできます。

  1. 再実行する移行をそのディレクトリから一時的な場所に移動します
  2. 同じ名前で別の移行を生成する
  3. 元の移行コードをコピーして、新しく生成された移行ファイルに貼り付けます
  4. 新しい移行を実行する
  5. 新しく生成された移行ファイルを削除します
  6. スキーマの移行を編集して、最新の値を削除します
  7. 古い移行ファイルを復元する
0
Greg Blass