Rails / MySql合并迁移

时间:2011-10-03 23:07:37

标签: ruby-on-rails rails-migrations

我有一个在MySql DB上运行的Rails应用程序。

有没有办法整合迁移? 例如:

假设我有一个名为members的非常大的表,我创建了一个迁移,将列name添加到该表中,稍后我创建另一个迁移,添加另一个字段address和将索引添加到address字段。

当我立即运行迁移时,它将更改表3次:添加name,添加address并添加索引。在每一次中,alter table命令实际上都会创建一个新表,将所有数据复制到该表并删除旧表。

在我的情况下,members表非常大,超过10M的记录,因此每个更改需要几个小时。

有没有办法将变更合并到一个变更中?

2 个答案:

答案 0 :(得分:2)

您的问题有点难以理解,因为您不限于每次迁移一次操作。

你可以很容易地做到:

class AddNameAddressAndIndexToMembers < ActiveRecord::Migration
  def up
    change_table :members do |t|
      t.string :name
      t.text :address
      t.index :name
    end
  end

  def down
    change_table :members do |t|
      t.remove_index :name
      t.remove :name, :address
    end
  end
end

只需撤消迁移,删除以前的迁移文件,运行此迁移,一切都应该正常。

现在,如果你的意思是这些是旧的迁移,它可能会很棘手,因为你不想反转大量的迁移。但是你想要实现什么?如果您只需要部署,请使用当前schema.rbrake db:schema:dump and rake db:schema:load

答案 1 :(得分:1)

如果您真的想要最大化速度,您可能应该考虑在执行调用中部署SQL,例如,您可以在其中创建具有所需结构的临时结果集,清空,删除和/或更改现有结构表,并从临时结果集重新填充该表:

class SQLRevisions < ActiveRecord::Migration
    def change
        execute "
            [SQL PROCESS CALL]
            [SQL PROCESS CALL]
            [ETC.]"
        end
    end

在本地测试您的迁移以获得预期结果,然后在您的生产实例上运行它。