Запустить один файл миграции
есть ли простой способ запустить одну миграцию? Я не хочу мигрировать в определенную версию, я просто хочу запустить определенную.
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"
- запуск в режиме консоли. (рельсы с)
-
скопируйте и пройдите класс, который находится в этом файле, в консоль.
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
создайте экземпляр класса
CreateUsers
:c1 = CreateUsers.new
- выполнить метод
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
. Имейте в виду, что все файлы миграции, соответствующие области, будут запущены.