Есть ли простой способ запустить одну миграцию? Я не хочу переходить на определенную версию, я просто хочу запустить определенную.
Есть ли простой способ запустить одну миграцию? Я не хочу переходить на определенную версию, я просто хочу запустить определенную.
Ответы:
Вы можете просто запустить код прямо из файла ruby:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
Примечание: более новые версии рельсов могут потребовать, AddFoos.new.up
а не AddFoos.up
.
Альтернативный способ (без IRB), основанный на том факте, что require возвращает массив имен классов:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
Обратите внимание, что если вы сделаете это, он, вероятно, не обновит schema_migrations
таблицу, но, похоже, это то, что вам нужно в любом случае.
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
AddFoos.new.up
change
вместо up
и down
, вам нужно будет запуститьAddFoos.new.migrate(:up)
AddFoos.new.change
Предполагая довольно свежую версию Rails, вы всегда можете запустить:
rake db:migrate:up VERSION=20090408054532
Где версия - это временная метка в имени файла миграции.
Изменить: В какой-то момент за последние 8 лет (я не уверен, какая версия) Rails добавил проверки, которые не позволяют запускаться, если он уже был запущен. На это указывает запись в schema_migrations
таблице. Чтобы перезапустить его, просто выполните rake db:migrate:redo VERSION=20090408054532
вместо этого.
rake db:migrate:down VERSION=XXX
Если вы хотите запустить определенную миграцию , выполните
$ 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
Если вы хотите запустить одну миграцию несколько раз, выполните
# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
(номер версии можно найти в имени файла вашей миграции)
Изменить: Вы также можете просто переименовать файл миграции, например:
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)
up
и 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 "./db/migrate/20150927161307_create_users.rb"
вместо копирования и вставки. Затем вы можете запустить класс таким же образом, создав экземпляр и вызвав метод, определенный в классе CreateUsers.new.change
.
Как 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
rails db:migrate VERSION=20160920130051
Если у вас возникли проблемы с путями, вы можете использовать
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Обратите внимание, что вместо этого script/runner
вам, возможно, придется использовать rails runner
новые рельсы.
Если вы хотите запустить его из консоли, это то, что вы ищете:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
Я попробовал другие ответы, но требование без Rails.root
меня не сработало.
Кроме того, .migrate(:up)
part принудительно перезапускает миграцию независимо от того, запущена она или нет. Это полезно, когда вы уже запустили миграцию, отмените ее, возитесь с базой данных и хотите быстрое решение, чтобы снова ее запустить.
Похоже, по крайней мере, в последней версии 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
. Помните, что все файлы миграции, соответствующие области действия, будут запущены.