运行单个迁移文件

nan*_*nan 253 ruby migration ruby-on-rails

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

gtd*_*gtd 404

假设相当新版本的Rails,您始终可以运行:

rake db:migrate:up VERSION=20090408054532
Run Code Online (Sandbox Code Playgroud)

其中version是迁移文件名中的时间戳.

编辑:在过去8年的某些时候(我不确定是什么版本)Rails添加了检查,如果它已经运行,它会阻止它运行.这由表中的条目表示schema_migrations.要重新运行它,只需执行即可rake db:migrate:redo VERSION=20090408054532.

  • 实际上命令是rake db:migrate:redo VERSION = my_version (119认同)
  • redo运行给定迁移的down方法和之后的up方法.up只运行up-method,我认为这正是提问者想要的. (22认同)
  • 如果数据库模式版本晚于有问题的迁移,则"up"似乎不会运行,例如,在合并其他人的更改时可能会发生这种情况. (7认同)
  • @Chirag Patel:这正是我想要的!谢谢! (2认同)
  • 谢谢,我使用了`rake db:migrate:down VERSION = XXX` (2认同)

Ori*_*rds 230

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

rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
Run Code Online (Sandbox Code Playgroud)

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

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

script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
Run Code Online (Sandbox Code Playgroud)

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

  • 有时你需要在require路径前面加一个'./',它肯定不会更新schema_migrations. (58认同)
  • 如果你的迁移使用`change`而不是`up`和`down`,你需要运行`AddFoos.new.migrate(:up)` (50认同)
  • 在调用之前,我必须创建一个迁移对象的实例.例如`AddFoos.new.up` (14认同)
  • 所以,总结一下Rails 3.2:`require"./db/migrate/db/migrate/20090408054532_add_foos.rb"`然后`AddFoos.new.up` (14认同)
  • 在rails 4中,您可以调用`AddFoos.new.change` (6认同)

Ben*_*ier 104

如果要运行特定迁移,请执行

$ rake db:migrate:up VERSION=20080906120000
Run Code Online (Sandbox Code Playgroud)

如果要多次运行迁移,请执行此操作

# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3
Run Code Online (Sandbox Code Playgroud)

如果你想运行一个单一的迁移时间,做

# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
Run Code Online (Sandbox Code Playgroud)

(您可以在迁移的文件名中找到版本号)


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

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)
Run Code Online (Sandbox Code Playgroud)

rake db:migrate然后将重新运行upnuked迁移的方法.


chi*_*ode 25

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

class AddPartNumberToProducts < ActiveRecord::Migration
  def change
    add_column :products, :part_number, :string
  end
end
Run Code Online (Sandbox Code Playgroud)

您可以创建迁移的实例,并运行migrate(:up)migrate(:down)上一个实例,如下所示:

$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
Run Code Online (Sandbox Code Playgroud)


小智 17

这是再次运行此迁移文件"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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建类的实例CreateUsers:c1 = CreateUsers.new

  4. 执行该change实例的方法:c1.change


小智 12

如果您遇到路径问题,可以使用

require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Run Code Online (Sandbox Code Playgroud)


Dee*_*ale 12

截至rails 5你也可以使用rails而不是rake

Rails 3 - 4

# < rails-5.0
rake db:migrate:up VERSION=20160920130051
Run Code Online (Sandbox Code Playgroud)

Rails 5

# >= rails-5.0
rake db:migrate:up VERSION=20160920130051

# or

rails db:migrate:up VERSION=20160920130051
Run Code Online (Sandbox Code Playgroud)


Tas*_*dis 9

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

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

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

此外,.migrate(:up)无论是否已经运行,part 都会强制迁移重新运行。当您已经运行迁移时,这很有用,通过弄乱数据库来撤消它并希望快速解决方案重新启动它。


vin*_*snz 5

请注意script/runner,您可能不得不rails runner在新的rails环境中使用.


ram*_*mya 5

方法1:

rake db:migrate:up VERSION=20080906120000
Run Code Online (Sandbox Code Playgroud)

方法2:

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

Sharding.run_on_all_shards{AddNameToUser.up}
Run Code Online (Sandbox Code Playgroud)

它完成了!!