运行一个迁移文件
有一个简单的方法来运行一个单一的迁移? 我不想迁移到某个特定的版本,我只是想运行一个特定的版本。
你可以直接从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”的步骤
- 运行控制台模式。 (导轨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
-
创build类
CreateUsers
一个实例:c1 = CreateUsers.new
- 执行该实例的方法
change
:c1.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来简单地执行新的对象。