Запуск одного файла миграции

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

Ответ 1

Вы можете просто запустить код непосредственно из рубинового файла:

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, но похоже, что вы все равно хотите.

Ответ 2

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

rake db:migrate:up VERSION=20090408054532

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

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

Ответ 3

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

$ 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.rb20151013131831_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 для ядерных ядер.

Ответ 4

Если вы внедрили метод 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)

Ответ 5

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

  • Запустите консольный режим. (рельсы c)
  • Скопируйте и запустите класс, находящийся в этом файле, на консоль.

    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
    
  • Создайте экземпляр класса CreateUsers: c1 = CreateUsers.new

  • Выполните метод change этого экземпляра: c1.change

Ответ 6

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

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'

Ответ 7

В качестве 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

Ответ 8

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

Ответ 9

Способ 1:

rake db:migrate:up VERSION=20080906120000

Способ 2:

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

Sharding.run_on_all_shards{AddNameToUser.up}

Сделано!!

Ответ 10

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

Ответ 11

Это что-то, что вы запускали один раз в качестве миграции, потому что это было необходимо, а затем оказалось полезным, что может потребоваться для запуска несколько раз?

возможно, вам нужно реорганизовать содержимое переноса в модель или другой объект, а затем ссылку перенаправления на новое местоположение.

Затем вы можете просто выполнить новый объект в своем заражении, вызвав ruby ​​в командной строке.

Ответ 12

Если вы хотите запустить его из консоли, это то, что вы ищете:

$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)

Я попробовал другие ответы, но требование без Rails.root не сработало для меня.

Кроме того, часть .migrate(:up) заставляет миграцию перезапускаться независимо от того, была она уже запущена или нет. Это полезно, когда вы уже запустили миграцию, отмените ее, возитесь с базой данных и хотите быстрое решение, чтобы снова ее запустить.