Есть ли простой способ запустить одну миграцию? Я не хочу переходить на определенную версию, я просто хочу запустить определенную.
ruby-on-rails
ruby
migration
бабушка
источник
источник
Ответы:
Вы можете просто запустить код прямо из файла ruby:
Примечание: более новые версии рельсов могут потребовать,
AddFoos.new.up
а неAddFoos.up
.Альтернативный способ (без IRB), основанный на том факте, что require возвращает массив имен классов:
Обратите внимание, что если вы сделаете это, он, вероятно, не обновит
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, вы всегда можете запустить:
Где версия - это временная метка в имени файла миграции.
Изменить: В какой-то момент за последние 8 лет (я не уверен, какая версия) Rails добавил проверки, которые не позволяют запускаться, если он уже был запущен. На это указывает запись в
schema_migrations
таблице. Чтобы перезапустить его, просто выполнитеrake db:migrate:redo VERSION=20090408054532
вместо этого.источник
rake db:migrate:down VERSION=XXX
Если вы хотите запустить определенную миграцию , выполните
Если вы хотите запустить миграцию несколько раз , выполните
Если вы хотите запустить одну миграцию несколько раз, выполните
(номер версии можно найти в имени файла вашей миграции)
Изменить: Вы также можете просто переименовать файл миграции, например:
20151013131830_my_migration.rb
->20151013131831_my_migration.rb
Затем выполняйте миграцию в обычном режиме, это будет относиться к миграции как к новой (полезно, если вы хотите выполнить миграцию в удаленной среде (например, промежуточной), над которой у вас меньше контроля.
Редактировать 2 : Вы также можете просто сбросить запись миграции в базе данных. Например:
rake db:migrate
затем повторно запуститup
метод ядерных миграций.источник
Если вы реализовали такой
change
метод:Вы можете создать экземпляр миграции и запустить
migrate(:up)
илиmigrate(:down)
на экземпляре, например так:источник
up
иdown
.Это шаги для повторного запуска этого файла миграции "20150927161307_create_users.rb"
Скопируйте и вставьте класс, который находится в этом файле, в консоль.
Создайте экземпляр класса
CreateUsers
:c1 = CreateUsers.new
change
этого экземпляра:c1.change
источник
require "./db/migrate/20150927161307_create_users.rb"
вместо копирования и вставки. Затем вы можете запустить класс таким же образом, создав экземпляр и вызвав метод, определенный в классеCreateUsers.new.change
.Как
rails 5
вы можете также использоватьrails
вместоrake
Рельсы 3 - 4
Рельсы 5
источник
rails db:migrate VERSION=20160920130051
Если у вас возникли проблемы с путями, вы можете использовать
источник
Способ 1:
Способ 2:
В Rails Console 1. Скопируйте и вставьте класс миграции в консоль (скажем, add_name_to_user.rb). 2. Затем в консоли введите следующее
Сделано!!
источник
Обратите внимание, что вместо этого
script/runner
вам, возможно, придется использоватьrails runner
новые рельсы.источник
Если вы хотите запустить его из консоли, это то, что вы ищете:
Я попробовал другие ответы, но требование без
Rails.root
меня не сработало.Кроме того,
.migrate(:up)
part принудительно перезапускает миграцию независимо от того, запущена она или нет. Это полезно, когда вы уже запустили миграцию, отмените ее, возитесь с базой данных и хотите быстрое решение, чтобы снова ее запустить.источник
Похоже, по крайней мере, в последней версии Rails (5.2 на момент написания статьи) есть еще один способ фильтрации выполняемых миграций. Можно передать фильтр в
SCOPE
переменную окружения, которая затем будет использоваться для выбора файлов миграции.Предполагая, что у вас есть два файла миграции
1_add_foos.rb
и2_add_foos.run_this_one.rb
работаетбудет выбирать и запускать только
2_add_foos.run_this_one.rb
. Помните, что все файлы миграции, соответствующие области действия, будут запущены.источник