Запустіть один міграційний файл


267

Чи є простий спосіб запустити одну міграцію? Я не хочу переходити на певну версію, я просто хочу запустити конкретну.


Це щось таке, що ви переходили один раз як міграція, оскільки воно трапилось потрібним, а потім виявляється корисним запитом, який може знадобитися кілька разів для запуску? можливо, вам слід перефактурувати вміст міграції в модель чи інший об’єкт, а потім мати посилання на міграцію на це нове місце. Тоді ви можете просто виконати новий об’єкт за вашим бажанням, викликавши рубін у командному рядку.
Натан Фегер

Відповіді:


239

Ви можете просто запустити код безпосередньо з файла 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таблицю, але, здається, це все одно ви хочете.


58
Іноді вам потрібен "./" перед потрібним шляхом, і це, безумовно, не оновлює схему_migrations.
Беардо

14
Мені довелося створити екземпляр об’єкта міграції, перш ніж я міг зателефонувати. наприкладAddFoos.new.up
Bentleyo

15
Отже, require "./db/migrate/db/migrate/20090408054532_add_foos.rb"AddFoos.new.up
підводячи

50
Якщо в процесі міграції використовує changeзамість upі down, вам потрібно запуститиAddFoos.new.migrate(:up)
Дон Верв

6
У рейки 4 ви можете зателефонуватиAddFoos.new.change
lfender6445

429

Якщо припустити досить недавню версію Rails, ви завжди можете запустити:

rake db:migrate:up VERSION=20090408054532

Де версія - мітка часу у назві файлу міграції.

Редагувати: У певний момент за останні 8 років (я не впевнений, у якій версії) Rails додав чеки, які заважають виконувати це, якщо воно вже запущено. Про це вказує запис у schema_migrationsтаблиці. Щоб повторно запустити його, просто виконайте rake db:migrate:redo VERSION=20090408054532замість цього.


124
Насправді команда - rake db: migrate: ponov VERSION = my_version
Patel

2
@Chirag Patel: Це саме те, що я шукав! Дякую!
Авель

23
redo запускає метод даної міграції та метод вгору після цього. Вгору працює тільки метод up-up, і я думаю, що саме цього хоче запитуючий.
Sven Koschnicke

7
Здається, що "вгору" не працює, якщо версія схеми бази даних пізніше зазначеної міграції, що може статися, наприклад, при об'єднанні змін іншої людини.
Метт Конноллі

3
Дякую, я використав це для "вниз"rake db:migrate:down VERSION=XXX
Nitrodist

107

Якщо ви хочете виконати певну міграцію , зробіть це

$ 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метод ядерних міграцій.


І "вгору", і "повторно" не працювали для мене, але видалення рядка в schema_migrations було ідеальним.
цезоїд

27

Якщо ви реалізували такий 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)

1
Це також стосується навіть якщо ви використовуєте upта down.
гак

17

Це кроки для повторного запуску цього файлу міграції "20150927161307_create_users.rb"

  1. Запустіть консольний режим. (рейки c)
  2. Скопіюйте та передайте на консоль клас, який знаходиться у цьому файлі.

    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
  3. Створіть примірник класу CreateUsers:c1 = CreateUsers.new

  4. Виконайте метод changeцього примірника:c1.change

просто потрібен файл з класом, наприклад в консолі: require "./db/migrate/20150927161307_create_users.rb"замість копіювання та вставки. Потім ви можете запустити клас тим же способом, інстанціюючи та викликаючи метод, визначений у класі CreateUsers.new.change.
VinnyQ77

13

З 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

1
він також здогадається, що вам потрібноrails db:migrate VERSION=20160920130051
frenesim

12

Якщо у вас виникають проблеми з шляхами, які ви можете використовувати

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'

6

Спосіб 1:

rake db:migrate:up VERSION=20080906120000

Спосіб 2:

На консолі Rails 1. Скопіюйте вставте клас міграції в консоль (скажімо add_name_to_user.rb) 2. Потім в консолі введіть наступне

Sharding.run_on_all_shards{AddNameToUser.up}

Це робиться!!


5

Зауважте, що замість цього script/runnerвам, можливо, доведеться використовувати rails runnerв нових рейок.


3

Якщо ви хочете запустити його з консолі, це те, що ви шукаєте:

$ 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, і хочете швидкого рішення, щоб воно було знову.


1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.