Я пытаюсь выполнить только одну миграцию из целой кучи в моем приложении rails. Как я могу это сделать? Я не хочу запускать какие-либо миграции до или после нее. Спасибо.
Ответы:
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
Расширение ответа на корч выше, 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 (2013-11-22, ревизия 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
и т. Д.