Answers:
您可以直接在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
表,但是无论如何,这似乎是您想要的。
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
然后AddFoos.new.up
change
不是up
和down
,则需要运行AddFoos.new.migrate(:up)
AddFoos.new.change
假设您使用的是Rails的最新版本,则可以始终运行:
rake db:migrate:up VERSION=20090408054532
其中version是迁移文件名中的时间戳。
编辑:在过去的8年中的某个时刻(我不确定是哪个版本),Rails添加了检查,以防止它已运行(如果已运行)。这由表中的条目指示schema_migrations
。要重新运行它,只需执行即可rake db:migrate:redo VERSION=20090408054532
。
rake db:migrate:down VERSION=XXX
如果要运行特定的迁移,请执行
$ 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.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
然后将重新运行up
裸迁移的方法。
如果您实现了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)
up
和,这也适用down
。
这是再次运行此迁移文件“ 20150927161307_create_users.rb”的步骤
将文件中的类复制并粘贴到控制台。
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
require "./db/migrate/20150927161307_create_users.rb"
而不是复制和粘贴。然后,可以通过实例化并调用类中定义的方法,以相同的方式运行该类CreateUsers.new.change
。
截至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
rails db:migrate VERSION=20160920130051
如果您在使用路径时遇到问题,可以使用
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
请注意script/runner
,您可能必须rails runner
在新的Rails环境中使用而不是。
如果要从控制台运行它,那么您正在寻找的是:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
我尝试了其他答案,但Rails.root
没有要求对我没有帮助。
此外,.migrate(:up)
part强制迁移重新运行,无论迁移是否已经运行。当您已经进行了迁移,通过弄乱数据库来撤消它并希望快速解决方案重新建立迁移时,这很有用。