Запустить один файл миграции - PullRequest
246 голосов
/ 16 апреля 2009

Есть ли простой способ запустить одну миграцию? Я не хочу переходить на определенную версию, я просто хочу запустить определенную.

Ответы [ 10 ]

378 голосов
/ 16 апреля 2009

Если предположить, что Rails имеет довольно свежую версию, вы всегда можете запустить:

rake db:migrate:up VERSION=20090408054532

Где версия - это временная метка в имени файла миграции.

Редактировать: В какой-то момент за последние 8 лет (я не уверен, какая версия) в Rails добавлены проверки, которые не позволяют запускаться, если он уже был запущен. На это указывает запись в таблице schema_migrations. Чтобы перезапустить его, просто выполните вместо него rake db:migrate:redo VERSION=20090408054532.

226 голосов
/ 16 апреля 2009

Вы можете просто запустить код прямо из файла ruby:

rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up

Примечание: более новые версии рельсов могут потребовать AddFoos.new.up вместо AddFoos.up.

Альтернативный способ (без IRB), основанный на том факте, что require возвращает массив имен классов:

script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'

Обратите внимание, что если вы сделаете это, вероятно, вы не обновите таблицу schema_migrations, но, похоже, это то, что вам нужно.

100 голосов
/ 07 июня 2013

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

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

24 голосов
/ 25 июля 2013

Если вы реализовали метод 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)
15 голосов
/ 28 сентября 2015

Это шаги для повторного запуска этого файла миграции "20150927161307_create_users.rb"

  1. Запустить режим консоли. (рельсы с)
  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
12 голосов
/ 23 октября 2014

Если у вас проблемы с путями, вы можете использовать

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
11 голосов
/ 20 сентября 2016

Начиная с 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
5 голосов
/ 26 мая 2015

Метод 1:

rake db:migrate:up VERSION=20080906120000

Метод 2:

In Rails Console 1. Скопируйте и вставьте класс миграции в консоль (например, add_name_to_user.rb). 2. Затем в консоли введите следующее

Sharding.run_on_all_shards{AddNameToUser.up}

Готово !!

5 голосов
/ 26 февраля 2012

Обратите внимание, что вместо script/runner вам может потребоваться использовать rails runner в новых средах рельсов.

1 голос
/ 10 апреля 2018

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

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