Чи є простий спосіб запустити одну міграцію? Я не хочу переходити на певну версію, я просто хочу запустити конкретну.
Чи є простий спосіб запустити одну міграцію? Я не хочу переходити на певну версію, я просто хочу запустити конкретну.
Відповіді:
Ви можете просто запустити код безпосередньо з файла 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.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)
частина змушує міграцію повторюватися незалежно від того, вона вже запущена чи ні. Це корисно для тих випадків, коли ви вже запустили міграцію, як-небудь скасуйте її, возившись з 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
. Майте на увазі, що всі файли міграції, що відповідають обсягу, будуть запущені.