Рейк всего за одну миграцию - PullRequest
86 голосов
/ 26 августа 2009

Я пытаюсь запустить только одну миграцию из целой связки в моем приложении rails. Как я могу это сделать? Я не хочу запускать какие-либо миграции до или после нее. Спасибо.

Ответы [ 11 ]

157 голосов
/ 26 августа 2009

rake db:migrate:redo VERSION=xxxxxxx, но при этом будет запущен down, а затем шаг up. Вы можете сделать это вместе с временным комментированием шага вниз.

69 голосов
/ 26 августа 2009
rake db:migrate:up VERSION=1234567890

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

25 голосов
/ 13 сентября 2009

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

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

Более полезно, это может быть помещено в задачу грабли и т. Д.

10 голосов
/ 02 июня 2013

rake db:migrate:up VERSION=version_no

Переносит (добавляет) определенный скрипт миграции

rake db:migrate:down VERSION=version_no

Удаляет конкретный скрипт миграции

9 голосов
/ 26 августа 2009
rake db:migrate VERSION=20098252345

попробуй.

3 голосов
/ 24 ноября 2014
rake db:migrate:redo version='xxxx'   

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

Вы можете проверить метки времени (идентификатор миграции) для предыдущих выполненных миграций, используя

rake db:migrate:status    
3 голосов
/ 20 мая 2014

Расширяя ответ корча выше, 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 голосов
/ 08 января 2015

Добавление моих 2 this к этому, потому что я столкнулся с этой же проблемой:

Если вы абсолютно хотите запустить миграцию заново, не создавая новую, вы можете сделать следующее:

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

И rails "забудет", что он запустил миграцию на 20150105181157. Теперь, когда вы запустите db: migrate, он снова запустится.

Это почти всегда плохая идея. Единственный случай, когда это может иметь смысл, - это если у вас есть ветка разработки, и вы еще не конкретизировали свою миграцию и хотите добавить некоторые вещи к ней в процессе разработки. Но даже тогда лучше выполнить миграцию в двух направлениях, чтобы можно было правильно выполнить откат и повторить попытку.

1 голос
/ 15 июня 2011

У меня есть служебный метод, который делает это очень простым в разработке. Я считаю, что это помогает мне избежать создания слишком большого количества миграций - обычно я изменяю миграции до тех пор, пока они не будут развернуты.

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

1 голос
/ 26 августа 2009

Должен быть способ запустить класс миграции через консоль. Я не могу заставить код миграции быть узнаваемым.

Однако, как показывают комментарии, предпочтительно выполнять миграцию по порядку. Использование:

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

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

...