Есть ли простой способ запуска одной миграции? Я не хочу переходить на определенную версию, я просто хочу запустить конкретную.
Вы можете просто запустить код непосредственно из рубинового файла:
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
, но похоже, что вы все равно хотите.
Предполагая, что вы всегда можете запустить довольно редкую версию Rails:
rake db:migrate:up VERSION=20090408054532
Где версия - это метка времени в имени файла миграции.
Изменить: в какой-то момент за последние 8 лет (я не уверен, какая версия) Rails добавила проверки, которые мешают этому запущенному, если он уже запущен. Об этом свидетельствует запись в таблице schema_migrations
. Чтобы повторно запустить его, просто удалите эту строку, а затем это будет работать.
Если вы хотите выполнить определенную миграцию, сделайте
$ 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 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
rails db:migrate VERSION=20160920130051
Способ 1:
rake db:migrate:up VERSION=20080906120000
Способ 2:
В Rails Console 1. Скопируйте вставьте класс миграции в консоль (скажем, add_name_to_user.rb) 2. Затем в консоли введите следующее
Sharding.run_on_all_shards{AddNameToUser.up}
Сделано!!
Обратите внимание, что вместо script/runner
вам может потребоваться использовать rails runner
в новых средах рельсов.
Это что-то, что вы запускали один раз в качестве миграции, потому что это было необходимо, а затем оказалось полезным, что может потребоваться для запуска несколько раз?
возможно, вам нужно реорганизовать содержимое переноса в модель или другой объект, а затем ссылку перенаправления на новое местоположение.
Затем вы можете просто выполнить новый объект в своем заражении, вызвав ruby в командной строке.