Чи є простий спосіб запустити одну міграцію? Я не хочу переходити на певну версію, я просто хочу запустити конкретну.
Чи є простий спосіб запустити одну міграцію? Я не хочу переходити на певну версію, я просто хочу запустити конкретну.
Відповіді:
Ви можете просто запустити код безпосередньо з файла ruby:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
Примітка: новіші версії рейок можуть знадобитися, AddFoos.new.upа не AddFoos.up.
Альтернативний спосіб (без IRB), який спирається на те, що вимагає повернення масиву назв класів:
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.changerequire "./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)частина змушує міграцію повторюватися незалежно від того, вона вже запущена чи ні. Це корисно для тих випадків, коли ви вже запустили міграцію, як-небудь скасуйте її, возившись з db, і хочете швидкого рішення, щоб воно було знову.
Схоже, щонайменше в останньому випуску 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. Майте на увазі, що всі файли міграції, що відповідають обсягу, будуть запущені.