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

206

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

  • 0
    Является ли это чем-то, что вы запускали один раз как миграцию, потому что это оказалось необходимым, а затем оказывается полезным запросом, который может потребоваться выполнить несколько раз? возможно, вам следует провести рефакторинг содержимого миграции в модель или другой объект, а затем указать ссылку на это новое местоположение. Затем вы можете просто выполнить новый объект по вашему усмотрению, вызвав ruby в командной строке.
Теги:
migration

10 ответов

193
Лучший ответ

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

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

  • 1
    Отлично. Как раз то, что мне было нужно.
  • 55
    Иногда вам нужен «./» перед требуемым путем, и он определенно не обновляет schema_migrations.
Показать ещё 10 комментариев
306

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

rake db:migrate:up VERSION=20090408054532

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

Изменить: в какой-то момент за последние 8 лет (я не уверен, какая версия) Rails добавила проверки, которые мешают этому запущенному, если он уже запущен. Об этом свидетельствует запись в таблице schema_migrations. Чтобы повторно запустить его, просто удалите эту строку, а затем это будет работать.

  • 0
    Это запустит миграцию до этой версии. Я искал способ запустить только определенную миграцию.
  • 119
    На самом деле это команда rake db: migrate: redo VERSION = my_version
Показать ещё 6 комментариев
82

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

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

  • 0
    И «вверх», и «повтор» у меня не сработали, но удаление строки в schema_migrations было идеальным.
21

Если вы внедрили метод 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)
  • 0
    Это также относится, даже если вы используете up и down .
11

Это шаги для повторного запуска этого файла миграции "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
  • 0
    Это действительно хорошо для меня в Rails4.1.7!
  • 0
    Действительно отличный, у меня работает и на Rails 5.
9

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

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

В качестве 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
  • 1
    это также угадать, что вам нужно с rails db:migrate VERSION=20160920130051
4

Способ 1:

rake db:migrate:up VERSION=20080906120000

Способ 2:

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

Sharding.run_on_all_shards{AddNameToUser.up}

Сделано!!

4

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

0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню