Згрібайте лише одну міграцію


94

Я намагаюся запустити лише одну міграцію з цілої групи в моєму додатку rails. Як я можу це зробити? Я не хочу запускати жодну міграцію до або після неї. Дякую.


1
Це була б зручна функція рейок: додайте STEP=nаргумент db:migrate(де nкількість міграцій для запуску, як і для db:rollback) - тоді ви можете зробити rake db:migrate STEP=1або rake db:migrate STEP=2тощо
user664833

Відповіді:


164

rake db:migrate:redo VERSION=xxxxxxx, але це запустить крок, downа потім up. Ви можете зробити це разом із тимчасовим коментуванням нижчого кроку.


Хм, blog.stonean.com/2007/12/18/rake-dbmigrateredo , :: redo, здається, не приймає аргумент VERSION.
Terry G Lorber

3
@pedrorolo: Це не застаріло. Це завдання не має опису, тому воно не відображатиметься у rake -T.
Ryan Bigg

1
@pedrorolo: db:test:prepareтакож не відображається в цьому списку. Боже, я запізнився на вечірку.
mraaroncruz

9
Для розширення того, що говорить Райан, якщо таблиця була вилучена з бази даних поза Rails, rake db:migrate:up VERSION=my_versionможе нічого не зробити , оскільки таблиця schema_migrations все ще говорить, що вона запущена. У тій же ситуації rake db:migrate:redo VERSION=my_versionможе не вдатися, оскільки він не може скинути таблицю. У цьому випадку тимчасово прокоментуйте downметод у міграції та повторітьrake db:migrate:redo...
Лев

3
І щоб розширити те, що говорить @Leo, якщо міграція визначена за допомогою def def, то змініть її на def self.up на додаток до вищезазначеного.
valk

70
rake db:migrate:up VERSION=1234567890

аналогічно, rake db:migrate:downщоб знизити конкретну міграцію. Ви можете отримати список доступних рейкових завдань за допомогою rake -T.


4
VERSIONЗгадано тут ціле значення на початку кожного з файлів міграції (це просто мітка часу, коли вона була створена). Наприклад, VERSION=20150720023630.
aaron-coding

3
Версії добре відображаються за допомогою rake db: migrate: status
jpgeek

Зауважимо, що VERSIONце просто змінна середовище, тому вона може вперше потрапити в команду або навіть встановити попередню команду:VERSION=1234567890 rake db:migrate:up
Джошуа Пінтер

25

Мені довелося запустити одну міграцію, яка змінилася і потребувала повторного запуску незалежно від усіх інших міграцій. Запустіть консоль і зробіть наступне:

>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down

Більш корисно це може бути застосовано до завдання граблі тощо.


6
Це працювало надзвичайно. Ви також можете просто скопіювати та вставити код із міграції в консоль, щоб визначити клас (і це дозволяє вручну маніпулювати, якщо це потрібно, якщо ви щойно помилились на Dev, наприклад). Якщо ви визначили оборотну міграцію за допомогою change, запустіть YourMigrations.migrate(:up)замість цього (або :downтеж!)
trisweb

1
можливо, доведетьсяrequire "#{Rails.root}/db/migrate/your_migrations.rb"
s2t2

15

rake db:migrate:up VERSION=version_no

Перенесе (додасть) конкретний сценарій міграції

rake db:migrate:down VERSION=version_no

Видалить конкретний сценарій міграції


10
rake db:migrate VERSION=20098252345

спробуй.


7
Я думаю, що це призведе до будь-яких міграцій до тієї, яку ви вказали.
Ken Liu

1
close, але це також запускає будь-які міграції до конкретної міграції.
Anon,

6
Я не думаю, що ви повинні / хочете запустити лише одну міграцію, не враховуючи попередні. Міграція - це представлення структури баз даних, оскільки вона стосується коду в певний момент часу, і, отже, міграції до того, як це буде необхідно. Якщо ви хочете запустити лише одну міграцію, швидше за все, ви не написали належних операцій вгору / вниз, щоб міграції функціонували ... це погана звичка писати лише свої міграції.
JP Silvashy

1
Примітно: VERSIONце просто змінна середовища, тому вона може бути першою в команді або навіть встановити попередню для команди:VERSION=20098252345 rake db:migrate
Джошуа Пінтер

4
rake db:migrate:redo version='xxxx'   

Не забудьте поставити лапки навколо xxxx, xxxx - це мітка часу (або ідентифікаційний номер міграції) для вашої міграції.

Ви можете перевірити мітки часу (ідентифікатор міграції) для попередніх міграцій, які ви робили за допомогою

rake db:migrate:status    

3

Розширення відповіді від korch вище requireдля мене не спрацювало, але loadзробило. Для конкретності файлу міграції:

    class ChangeMinQuantityToRaces < ActiveRecord::Migration
      def change
        change_column :races, :min_quantity, :integer, :default => 0
      end
    end

в консолі набравши

    > load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
    > ChangeMinQuantityToRaces.new.change

працював на мене.

    > Race.new.min_quantity # => 0 

Це було для ruby ​​1.9.3p484 (редакція 22.11.2013 43786) [x86_64-linux] та Rails 3.2.13.


2

Додавання мого 2 ¢ до цього, тому що я зіткнувся з цією ж проблемою:

Якщо ви абсолютно хочете запустити міграцію знову без створення нової, ви можете зробити наступне:

rails dbconsole -p devdb=# delete from public.schema_migrations where version = '20150105181157';

І rails "забудуть", що він запустив міграцію за 20150105181157. Тепер, коли ви запустите db: migrate, він запустить його знову.

Однак це майже завжди погана ідея. Єдиний приклад, коли це може мати сенс, це якщо у вас є гілка розробки, і ви ще не допрацювали свою міграцію і хочете додати до неї деякі речі в процесі розробки. Але навіть тоді краще зробити міграцію двосторонньою, щоб ви могли правильно відкатати та повторити спробу.


1

Має бути спосіб запустити клас міграції через консоль. Здається, я не можу змусити код міграції бути впізнаваним.

Однак, як зазначають коментарі, переважно виконувати міграції по порядку. Використання:

rake db:migrate VERSION=##########

Скопіювати та вставити свій код під час переходу на скрипт / консоль?


1

У мене є корисний метод, який робить це дуже простим у розвитку. Я вважаю, що це допомагає мені уникнути створення занадто великої кількості міграцій - зазвичай я змінюю міграції, поки вони не будуть розгорнуті.

http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/


0

Я використовую цю техніку в розробці, коли змінюю значну кількість міграції, і не хочу мігрувати на тонну і втрачати будь-які дані в дорозі (особливо коли я імпортую застарілі дані, що займають тривалий час, Не хочу повторно імпортувати знову).

Це 100% хакі, і я б точно не рекомендував робити це у виробництві, але це зробить трюк:

  1. Перемістіть міграцію, для якої потрібно повторно запустити її каталог, у тимчасове місце
  2. Згенеруйте ще одну міграцію з такою ж назвою
  3. Скопіюйте / вставте вихідний код міграції у щойно створений файл міграції
  4. Запустіть нову міграцію
  5. Видаліть щойно створений файл міграції
  6. Відредагуйте міграцію схеми, щоб видалити останнє значення
  7. Відновіть старий файл міграції
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.