0

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

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

假设我有一个非常大的表members,我创建了一个迁移以name向该表添加列,稍后我创建另一个迁移,该迁移添加另一个字段address并向该address字段添加索引。

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

在我的例子中,members表非常大,超过 10M 的记录,所以每次修改需要几个小时。

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

4

2 回答 2

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 和 rake db:schema:load一起使用

于 2011-10-03T23:36:32.180 回答
1

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

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

Test your migration locally for the intended results, and then run it on your production instance.

于 2012-09-10T21:32:27.707 回答