Запустить один файл миграции

есть ли простой способ запустить одну миграцию? Я не хочу мигрировать в определенную версию, я просто хочу запустить определенную.

10 ответов


вы можете просто запустить код непосредственно из файла ruby:

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

Примечание: более новые версии rails могут потребовать AddFoos.new.up, а не AddFoos.up.

альтернативный способ (без IRB), который опирается на тот факт, что require возвращает массив имен классов:

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

обратите внимание, что если вы это сделаете, он, вероятно, не будет обновлять schema_migrations таблица, но кажется, что это то, что вы хотите в любом случае.


предполагая, что довольно недавняя версия Rails вы всегда можете запустить:

rake db:migrate:up VERSION=20090408054532

где version-метка времени в имени файла миграции.

Edit: в какой-то момент за последние 8 лет (я не уверен, какая версия) Rails добавил проверки, которые мешают этому работать, если он уже запущен. На это указывает запись в schema_migrations таблица. Чтобы повторно запустить его, просто выполните rake db:migrate:redo VERSION=20090408054532 вместо.


если вы хотите выполнить определенную миграцию, do

$ rake db:migrate:up VERSION=20080906120000

если вы хотите выполнить перенос несколько раз, do

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

если вы хотите запустить один миграция несколько, а не

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

(вы можете найти номер версии в имени файла миграции)


Edit: вы также можете просто переименовать файл миграции, например:

20151013131830_my_migration.rb ->20151013131831_my_migration.rb

затем мигрируйте нормально, это будет рассматривать миграцию как новую (полезно, если вы хотите мигрировать в удаленной среде (например, промежуточной), на которой у вас меньше контроля.

Изменить 2: вы также можете просто уничтожить запись миграции в базе данных. Например:

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

rake db:migrate затем повторите up метод ядерных миграций.


если вы реализовали 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)

это шаги для повторного запуска этого файла миграции " 20150927161307_create_users.rb"

  1. запуск в режиме консоли. (рельсы с)
  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

Если у вас возникли проблемы с путями, вы можете использовать

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

по состоянию на 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

Пожалуйста, обратите внимание, что вместо script/runner, возможно, вам придется использовать rails runner в новых средах rails.


Способ 1 :

rake db:migrate:up VERSION=20080906120000

Способ 2:

В Консоли Рельсы 1. Скопируйте вставку класса миграции в консоль (например, add_name_to_user.рубидий) 2. Затем в консоли введите следующее

Sharding.run_on_all_shards{AddNameToUser.up}

это делается!!


похоже, по крайней мере, в последнем выпуске Rails (5.2 на момент написания) есть еще один способ фильтрации выполняемых миграций. Можно пройти фильтр в SCOPE переменная среды, которая затем будет использоваться для выбора файлов миграции.

предполагая, что у вас есть два файла миграции 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. Имейте в виду, что все файлы миграции, соответствующие области, будут запущены.