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


当前回答

至于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

其他回答

如果您希望运行特定的迁移,请执行

$ 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.2)中还有一种过滤正在运行的迁移的方法。可以在SCOPE环境变量中传递一个过滤器,然后使用该过滤器选择迁移文件。

假设您有两个迁移文件1_add_foos。Rb和2_add_fos .run_this_one. Rb运行

SCOPE=run_this_one rails db:migrate:up

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

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

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

我尝试了其他答案,但要求没有Rails。根对我没用。

此外,.migrate(:up)部分强制迁移重新运行,无论它是否已经运行。这对于当你已经运行了一个迁移,但因为打乱了db而有点取消了它,并且想要一个快速的解决方案重新启动它的时候很有用。

至于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

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