web-dev-qa-db-ja.com

単一の移行ファイルを実行する

単一の移行を実行する簡単な方法はありますか?特定のバージョンに移行するのではなく、特定のバージョンを実行するだけです。

246
nan

Rubyファイルから直接コードを実行できます。

Rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up

注:Railsの新しいバージョンでは、AddFoos.new.upではなくAddFoos.upが必要になる場合があります。

Requireがクラス名の配列を返すという事実に依存する代替方法(IRBなし):

script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'

これを行うと、おそらくschema_migrationsテーブルは更新されないことに注意してください。しかし、とにかくそれはあなたが望むもののようです。

226
Orion Edwards

Railsのかなり最近のバージョンを想定すると、いつでも実行できます:

rake db:migrate:up VERSION=20090408054532

Versionは、移行のファイル名のタイムスタンプです。

編集:過去8年間のどこかの時点で(どのバージョンかわからない)Railsは、既に実行されている場合に実行されないようにするチェックを追加しました。 schema_migrationsテーブルで再実行するには、代わりにrake db:migrate:redo VERSION=20090408054532を実行します。

378
gtd

特定の移行を実行する にしたい場合は、

$ rake db:migrate:up VERSION=20080906120000

移行を実行する場合 複数回

# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3

singlemigrationmultiple回実行したい場合は、

# this is super useful
$ rake db:migrate:redo VERSION=20080906120000

(バージョン番号は移行のファイル名で確認できます)


編集:また、移行ファイルの名前を変更することもできます。例:

20151013131830_my_migration.rb-> 20151013131831_my_migration.rb

その後、通常どおり移行します。これにより、移行が新しいものとして扱われます(制御が少ないリモート環境(ステージングなど)に移行する場合に便利です)。

Edit 2:データベースの移行エントリを削除することもできます。例えば:

Rails_c> q = "delete from schema_migrations where version = '20151013131830'"
Rails_c> ActiveRecord::Base.connection.execute(q)

その後、rake db:migrateは、nuked移行のupメソッドを再実行します。

100

次のようなchangeメソッドを実装した場合:

class AddPartNumberToProducts < ActiveRecord::Migration
  def change
    add_column :products, :part_number, :string
  end
end

次のように、移行のインスタンスを作成し、インスタンスでmigrate(:up)またはmigrate(:down)を実行できます。

$ Rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
24
chibicode

これは、この移行ファイル「20150927161307_create_users.rb」を再度実行する手順です

  1. コンソールモードを実行します。 (レールc)
  2. そのファイルにあるクラスをコンソールにコピーして貼り付けます。

    class CreateUsers < ActiveRecord::Migration
      def change
        create_table :users do |t|
          t.string :name
          t.string :email
          t.timestamps null: false   end
        end
      end
    end
    
  3. クラスCreateUsersのインスタンスを作成します:c1 = CreateUsers.new

  4. そのインスタンスのchangeメソッドを実行します:c1.change
15
rolph dzounga

パスに問題がある場合は、使用できます

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
12

Rails 5の時点で、Railsの代わりにrakeを使用することもできます

レール3-4

# < Rails-5.0
rake db:migrate:up VERSION=20160920130051

レール5

# >= Rails-5.0
rake db:migrate:up VERSION=20160920130051

# or

Rails db:migrate:up VERSION=20160920130051
11
Deepak Mahakale

script/runnerの代わりに、新しいRails環境でRails runnerを使用する必要がある場合があることに注意してください。

5
viniciusnz

方法1:

rake db:migrate:up VERSION=20080906120000

方法2:

Rails Consoleで1.移行クラスをコンソールにコピーして貼り付けます(たとえば、add_name_to_user.rb)2.次に、コンソールで次のように入力します。

Sharding.run_on_all_shards{AddNameToUser.up}

されております!!

5
ramya

少なくとも最新のRailsリリース(執筆時点では5.2)では、実行中の移行をフィルタリングする方法がもう1つあるようです。 SCOPE環境変数でフィルターを渡すことができます。この変数は、移行ファイルの選択に使用されます。

2つの移行ファイル1_add_foos.rbおよび2_add_foos.run_this_one.rbが実行されていると仮定します

SCOPE=run_this_one Rails db:migrate:up

2_add_foos.run_this_one.rbのみを選択して実行します。スコープに一致するすべての移行ファイルが実行されることに注意してください。

1
szymek