Відповіді:
rake db:migrate:redo VERSION=xxxxxxx
, але це запустить крок, down
а потім up
. Ви можете зробити це разом із тимчасовим коментуванням нижчого кроку.
rake -T
.
db:test:prepare
також не відображається в цьому списку. Боже, я запізнився на вечірку.
rake db:migrate:up VERSION=my_version
може нічого не зробити , оскільки таблиця schema_migrations все ще говорить, що вона запущена. У тій же ситуації rake db:migrate:redo VERSION=my_version
може не вдатися, оскільки він не може скинути таблицю. У цьому випадку тимчасово прокоментуйте down
метод у міграції та повторітьrake db:migrate:redo...
rake db:migrate:up VERSION=1234567890
аналогічно, rake db:migrate:down
щоб знизити конкретну міграцію. Ви можете отримати список доступних рейкових завдань за допомогою rake -T
.
VERSION
Згадано тут ціле значення на початку кожного з файлів міграції (це просто мітка часу, коли вона була створена). Наприклад, VERSION=20150720023630
.
VERSION
це просто змінна середовище, тому вона може вперше потрапити в команду або навіть встановити попередню команду:VERSION=1234567890 rake db:migrate:up
Мені довелося запустити одну міграцію, яка змінилася і потребувала повторного запуску незалежно від усіх інших міграцій. Запустіть консоль і зробіть наступне:
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
Більш корисно це може бути застосовано до завдання граблі тощо.
change
, запустіть YourMigrations.migrate(:up)
замість цього (або :down
теж!)
require "#{Rails.root}/db/migrate/your_migrations.rb"
rake db:migrate VERSION=20098252345
спробуй.
VERSION
це просто змінна середовища, тому вона може бути першою в команді або навіть встановити попередню для команди:VERSION=20098252345 rake db:migrate
rake db:migrate:redo version='xxxx'
Не забудьте поставити лапки навколо xxxx, xxxx - це мітка часу (або ідентифікаційний номер міграції) для вашої міграції.
Ви можете перевірити мітки часу (ідентифікатор міграції) для попередніх міграцій, які ви робили за допомогою
rake db:migrate:status
Розширення відповіді від 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 ¢ до цього, тому що я зіткнувся з цією ж проблемою:
Якщо ви абсолютно хочете запустити міграцію знову без створення нової, ви можете зробити наступне:
rails dbconsole -p
devdb=# delete from public.schema_migrations where version = '20150105181157';
І rails "забудуть", що він запустив міграцію за 20150105181157. Тепер, коли ви запустите db: migrate, він запустить його знову.
Однак це майже завжди погана ідея. Єдиний приклад, коли це може мати сенс, це якщо у вас є гілка розробки, і ви ще не допрацювали свою міграцію і хочете додати до неї деякі речі в процесі розробки. Але навіть тоді краще зробити міграцію двосторонньою, щоб ви могли правильно відкатати та повторити спробу.
Має бути спосіб запустити клас міграції через консоль. Здається, я не можу змусити код міграції бути впізнаваним.
Однак, як зазначають коментарі, переважно виконувати міграції по порядку. Використання:
rake db:migrate VERSION=##########
Скопіювати та вставити свій код під час переходу на скрипт / консоль?
У мене є корисний метод, який робить це дуже простим у розвитку. Я вважаю, що це допомагає мені уникнути створення занадто великої кількості міграцій - зазвичай я змінюю міграції, поки вони не будуть розгорнуті.
http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/
Я використовую цю техніку в розробці, коли змінюю значну кількість міграції, і не хочу мігрувати на тонну і втрачати будь-які дані в дорозі (особливо коли я імпортую застарілі дані, що займають тривалий час, Не хочу повторно імпортувати знову).
Це 100% хакі, і я б точно не рекомендував робити це у виробництві, але це зробить трюк:
STEP=n
аргументdb:migrate
(деn
кількість міграцій для запуску, як і дляdb:rollback
) - тоді ви можете зробитиrake db:migrate STEP=1
абоrake db:migrate STEP=2
тощо