运行一个迁移文件

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

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

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

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

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

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

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

假设相当新的Rails版本,你总是可以运行:

 rake db:migrate:up VERSION=20090408054532 

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

编辑:在过去的8年(我不知道什么版本)的某个时候,Rails添加了检查,如果它已经运行,防止这个运行。 这由schema_migrations表中的条目指示。 要重新运行它,只需删除该行,然后这将工作。

如果你想运行一个特定的迁移 ,那么

 $ 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 

(你可以在你的迁移的文件名中find版本号)


编辑:您也可以简单地重命名您的迁移文件,例如:

20151013131830_my_migration.rb – > 20151013131831_my_migration.rb

然后正常迁移,这将把迁移视为一个新的迁移(有用的,如果你想迁移远程环境(如分段),你有较less的控制。

编辑2 :您也可以在数据库中核实迁移条目。 例如:

 rails_c> q = "delete from schema_migrations where version = '20151013131830'" rails_c> ActiveRecord::Base.connection.execute(q) 

rake db:migrate会重新运行nuked migrations的up方法。

如果您已经实现了像这样的change方法:

 class AddPartNumberToProducts < ActiveRecord::Migration def change add_column :products, :part_number, :string end end 

您可以创build迁移实例,并对实例运行migrate(:up)migrate(:down) ,如下所示:

 $ rails console >> require "db/migrate/20090408054532_add_part_number_to_products.rb" >> AddPartNumberToProducts.new.migrate(:down) 

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

  1. 运行控制台模式。 (导轨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. 创build类CreateUsers一个实例: c1 = CreateUsers.new

  4. 执行该实例的方法changec1.change

如果您遇到可以使用的path问题

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

至于rails 5您也可以使用rails代替rake

导轨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 

请注意,而不是script/runner ,你可能不得不在新的轨道环境使用rails runner

方法1:

 rake db:migrate:up VERSION=20080906120000 

方法2:

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

 Sharding.run_on_all_shards{AddNameToUser.up} 

它完成了!

这是你作为一个迁移运行一次,因为它恰好是需要的,然后结果是一个有用的查询,可能需要运行多次?

也许你应该将迁移的内容重构成模型或其他对象,然后让迁移引用这个新的位置。

然后,您可以通过在命令行上调用ruby来简单地执行新的对象。