是否有一种简单的方法来运行单个迁移?我不想迁移到某个版本,我只想运行一个特定的版本。
当前回答
如果您希望运行特定的迁移,请执行
$ 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会重新运行nuked迁移的up方法。
其他回答
至于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
假设你可以运行最新版本的Rails:
rake db:migrate:up VERSION=20090408054532
其中version是迁移文件名中的时间戳。
编辑:在过去8年的某个时候(我不确定是哪个版本),Rails添加了检查,如果它已经运行,则阻止它运行。schema_migrations表中的一个条目表明了这一点。要重新运行它,只需执行rake db:migrate:redo VERSION=20090408054532即可。
你可以直接从ruby文件中运行代码:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.new.up
注意:非常老版本的rails可能需要addfoo。up而不是addfoo .new.up。
另一种方法(没有IRB)依赖于require返回类名数组的事实:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
注意,如果这样做,就不会更新schema_migrations表,但这似乎正是您想要的结果。
此外,如果无法找到文件,您可能需要使用require("./db/…"或根据您的工作目录尝试require_relative
请注意,您可能不得不在新的rails环境中使用rails runner而不是script/runner。
如果您希望运行特定的迁移,请执行
$ 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会重新运行nuked迁移的up方法。
推荐文章
- RVM不是一个函数,用' RVM use…’不会起作用
- 了解Gemfile。锁文件
- 如何确定一个数组是否包含另一个数组的所有元素
- Rails find_or_create_by多个属性?
- Rails ActiveRecord日期之间
- 是什么导致这个ActiveRecord::ReadOnlyRecord错误?
- 最好的打印散列的方法
- Rails:dependent =>:destroy VS:dependent =>:delete_all
- 我可以在不包含Ruby模块的情况下调用实例方法吗?
- 如何将新项目添加到哈希
- 测试一个Ruby类是否是另一个类的子类
- 什么时候使用Struct vs. OpenStruct?
- 对于PostgreSQL表来说,多大才算太大?
- 数组到哈希Ruby
- 我如何让红宝石打印一个完整的回溯而不是截断一个?