Есть ли простой способ запуска одной миграции? Я не хочу переходить на определенную версию, я просто хочу запустить конкретную.
Запуск одного файла миграции
Ответ 1
Вы можете просто запустить код непосредственно из рубинового файла:
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
, но похоже, что вы все равно хотите.
Ответ 2
Предполагая довольно свежую версию Rails, вы всегда можете запустить:
rake db:migrate:up VERSION=20090408054532
Где версия - это временная метка в имени файла миграции.
Изменение: В какой-то момент за последние 8 лет (я не уверен, какая версия) Rails добавил проверки, которые не позволяют запускаться, если он уже был запущен. На это указывает запись в таблице schema_migrations
. Чтобы перезапустить его, просто запустите rake db:migrate:redo VERSION=20090408054532
.
Ответ 3
Если вы хотите выполнить определенную миграцию, сделайте
$ 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
для ядерных ядер.
Ответ 4
Если вы внедрили метод 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)
Ответ 5
Это шаги для повторного запуска этого файла миграции "20150927161307_create_users.rb"
- Запустите консольный режим. (рельсы c)
-
Скопируйте и запустите класс, находящийся в этом файле, на консоль.
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
Ответ 6
Если у вас возникли проблемы с путями, вы можете использовать
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Ответ 7
В качестве 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
Ответ 8
Обратите внимание, что вместо script/runner
вам может потребоваться использовать rails runner
в новых средах рельсов.
Ответ 9
Способ 1:
rake db:migrate:up VERSION=20080906120000
Способ 2:
В Rails Console 1. Скопируйте вставьте класс миграции в консоль (скажем, add_name_to_user.rb) 2. Затем в консоли введите следующее
Sharding.run_on_all_shards{AddNameToUser.up}
Сделано!!
Ответ 10
Похоже, по крайней мере, в последней версии 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
. Имейте в виду, что все файлы миграции, соответствующие области действия, будут запущены.
Ответ 11
Это что-то, что вы запускали один раз в качестве миграции, потому что это было необходимо, а затем оказалось полезным, что может потребоваться для запуска несколько раз?
возможно, вам нужно реорганизовать содержимое переноса в модель или другой объект, а затем ссылку перенаправления на новое местоположение.
Затем вы можете просто выполнить новый объект в своем заражении, вызвав ruby в командной строке.
Ответ 12
Если вы хотите запустить его из консоли, это то, что вы ищете:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
Я попробовал другие ответы, но требование без Rails.root
не сработало для меня.
Кроме того, часть .migrate(:up)
заставляет миграцию перезапускаться независимо от того, была она уже запущена или нет. Это полезно, когда вы уже запустили миграцию, отмените ее, возитесь с базой данных и хотите быстрое решение, чтобы снова ее запустить.