运行单个迁移文件

时间:2009-04-15 22:03:04

标签: ruby-on-rails ruby migration

有一种简单的方法可以运行单个迁移吗?我不想迁移到某个版本,我只想运行特定版本。

11 个答案:

答案 0 :(得分:378)

假设Rails版本相当新,你可以随时运行:

rake db:migrate:up VERSION=20090408054532

其中version是迁移文件名中的时间戳。

编辑:过去8年中的某些时候(我不确定是什么版本)Rails添加了一些检查,如果已经运行,它会阻止它运行。这由schema_migrations表中的条目指示。要重新运行它,只需执行rake db:migrate:redo VERSION=20090408054532

答案 1 :(得分:225)

您可以直接从ruby文件中运行代码:

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

注意:较新版本的rails可能需要AddFoos.new.up而不是AddFoos.up

另一种方法(没有IRB)依赖于require返回一个类名数组的事实:

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

请注意,如果你这样做,它可能不会更新schema_migrations表,但看起来这就是你想要的。

答案 2 :(得分:100)

如果您想run a specific migration,请执行

$ rake db:migrate:up VERSION=20080906120000

如果您要运行迁移multiple times,请执行

# 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将重新运行nuked迁移的up方法。

答案 3 :(得分:24)

如果你已经实现了这样的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)

答案 4 :(得分:15)

这是再次运行此迁移文件“20150927161307_create_users.rb”的步骤

  1. 运行控制台模式。 (rails c)
  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. 执行该实例的方法changec1.change

答案 5 :(得分:12)

如果您遇到路径问题,可以使用

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

答案 6 :(得分:11)

rails 5起,您还可以使用rails代替rake

Rails 3 - 4

# < rails-5.0
rake db:migrate:up VERSION=20160920130051

Rails 5

# >= rails-5.0
rake db:migrate:up VERSION=20160920130051

# or

rails db:migrate:up VERSION=20160920130051

答案 7 :(得分:5)

请注意,您可能必须在新的rails环境中使用script/runner而不是rails runner

答案 8 :(得分:5)

方法1:

rake db:migrate:up VERSION=20080906120000

方法2:

在Rails控制台中  1.在迁移器中复制粘贴迁移类(比如add_name_to_user.rb)  2.然后在控制台中,键入以下

Sharding.run_on_all_shards{AddNameToUser.up}

完成!!

答案 9 :(得分:3)

如果要从控制台运行它,这就是您想要的:

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

我尝试了其他答案,但是没有Rails.root的要求对我没有帮助。

此外,.migrate(:up)部分会强制重新运行迁移,无论迁移是否已经运行。当您已经进行了迁移,通过弄乱数据库来撤消它并希望快速解决方案重新建立迁移时,这很有用。

答案 10 :(得分:1)

至少在最新的Rails版本中(在撰写本文时为5.2),还有一种方法可以过滤正在运行的迁移。可以在SCOPE环境变量中传递过滤器,然后用于选择迁移文件。

假设您有两个迁移文件1_add_foos.rb2_add_foos.run_this_one.rb正在运行

SCOPE=run_this_one rails db:migrate:up

将仅选择并运行2_add_foos.run_this_one.rb。请记住,将运行与范围匹配的所有迁移文件。