移行は1回だけ


94

私は私のRailsアプリで束全体から1つの移行だけを実行しようとしています。これどうやってするの?移行の前後に移行を実行したくありません。ありがとう。


1
これは便利なレールが備わっていますされます:追加STEP=nの引数をdb:migrate(ここで、n移行の数がためにそこにいるだけのように、実行することですdb:rollback) -あなたは何ができるrake db:migrate STEP=1rake db:migrate STEP=2、など
user664833

回答:


164

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


うーん、blog.stonean.com/2007/12/18/rake-dbmigrateredo、::やり直しはVERSION引数を取るようには見えません。
Terry G Lorber、

3
@pedrorolo:これは古くはありません。このタスクには説明がないため、には表示されませんrake -T
Ryan Bigg、2011年

1
@pedrorolo:db:test:prepareそのリストにも表示されません。神私はパーティーに遅れました。
mraaroncruz 2011

9
Ryan の発言を拡張すると、Railsの外部のデータベースからテーブルが削除されたrake db:migrate:up VERSION=my_version場合、schema_migrationsテーブルはまだ実行されていると表示されるため、も実行されない可能性があります。同じ状況でrake db:migrate:redo VERSION=my_versionは、テーブルを削除できないために失敗する可能性あります。この場合、down移行のメソッドを一時的にコメント化して再実行しますrake db:migrate:redo...
Leo

3
また、@ Leoの内容を拡張するには、移行がdef changeで定義されている場合、上記に加えてdef self.upに変更します。
ヴォーク、2014年

70
rake db:migrate:up VERSION=1234567890

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


4
ここでVERSION言及されているのは、各移行ファイルの先頭にある整数値です(これは、作成されたときのタイムスタンプにすぎません)。たとえば、 VERSION=20150720023630
アーロンコーディング

3
バージョンはすくいデシベルとうまく表示されます。移行:状態
jpgeek

注目すべきは、VERSIONそれがコマンドで最初に来たり、コマンドを以前に設定することができますので、ちょうど環境変数です:VERSION=1234567890 rake db:migrate:up
ジョシュアピンター

25

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

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

より便利には、これをrakeタスクなどに入れることができます。


6
これはすばらしく機能しました。また、移行からコンソールにコードをコピーアンドペーストしてクラスを定義することもできます(これにより、たとえば、Devを間違えただけの場合は、必要に応じて手動で操作できます)。でリバーシブルマイグレーションを定義した場合はchangeYourMigrations.migrate(:up)代わりに(または:downあまりにも)実行します
trisweb

1
必要があるかもしれませんrequire "#{Rails.root}/db/migrate/your_migrations.rb"
s2t2 2015年

15

rake db:migrate:up VERSION=version_no

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

rake db:migrate:down VERSION=version_no

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


10
rake db:migrate VERSION=20098252345

試してみてください。


7
これにより、指定した移行までのすべての移行が実行されると思います。
Ken Liu、

1
閉じますが、特定の移行の前に移行も実行されます。
Anon、

6
その前のマイグレーションを考慮せずに、マイグレーションを1つだけ実行する必要がある/したくないと思います。マイグレーションは、特定の時点でのコードに関連するデータベース構造の表現であり、したがって、それが必要になる前のマイグレーションです。1つのマイグレーションのみを実行したい場合は、マイグレーションを機能させるために適切なアップ/ダウン操作を記述していない可能性があります...アップマイグレーションのみを記述するのは悪い習慣です。
JP Silvashy 2009

1
注目すべき:VERSIONそれはコマンドで最初に来たり、コマンドを以前に設定することができますので、ちょうど環境変数です:VERSION=20098252345 rake db:migrate
ジョシュアピンター

4
rake db:migrate:redo version='xxxx'   

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

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

rake db:migrate:status    

3

上記の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用でした。


2

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

新しい移行を作成せずに移行をやり直したい場合は、次の操作を実行できます。

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

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

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


1

コンソールを介して移行クラスを実行する方法があるはずです。移行コードを認識できないようです。

ただし、コメントが示すように、移行を順番に実行することをお勧めします。使用する:

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

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



0

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

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

  1. 再実行する移行をディレクトリから一時的な場所に移動します
  2. 同じ名前で別のマイグレーションを生成する
  3. 元の移行コードをコピーして、新しく生成された移行ファイルに貼り付けます
  4. 新しい移行を実行する
  5. 新しく生成された移行ファイルを削除する
  6. スキーマの移行を編集して最新の値を削除します
  7. 古い移行ファイルを復元する
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.