我有一个在MySql DB上运行的Rails应用程序。
有没有办法整合迁移? 例如:
假设我有一个名为members
的非常大的表,我创建了一个迁移,将列name
添加到该表中,稍后我创建另一个迁移,添加另一个字段address
和将索引添加到address
字段。
当我立即运行迁移时,它将更改表3次:添加name
,添加address
并添加索引。在每一次中,alter table命令实际上都会创建一个新表,将所有数据复制到该表并删除旧表。
在我的情况下,members
表非常大,超过10M的记录,因此每个更改需要几个小时。
有没有办法将变更合并到一个变更中?
答案 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.rb和rake 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
在本地测试您的迁移以获得预期结果,然后在您的生产实例上运行它。