我有一个运行在MySql数据库上的Rails应用程序。
有没有合并迁移的方法?例如:
假设我有一个名为members的非常大的表,我创建了一个迁移来将列name添加到该表中,稍后我创建了另一个迁移,该迁移添加了另一个字段address并向address字段添加了索引。
当我现在运行迁移时,它将更改表3次:添加索引、添加address和添加索引。每一次,alter table命令实际上都会创建一个新表,将所有数据复制到新表中,然后删除旧表。
在我的例子中,members表非常大,超过10M条记录,所以每次修改都需要几个小时。
有没有办法将这些更改合并到一个alter中?
发布于 2011-10-04 07:36:32
您的问题有点难以理解,因为您不限于每次迁移只能执行一个操作。
您可以轻松地执行以下操作:
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只需撤销您的迁移,删除以前的迁移文件,运行此迁移,一切都应该很好。
现在,如果您的意思是这些是旧的迁移,这可能是棘手的,因为您不想逆转成吨的迁移。但是你想要实现什么呢?如果只需要部署,请在rake db:schema:dump and rake db:schema:load中使用当前的schema.rb
发布于 2012-09-11 05:32:28
如果您确实希望最大限度地提高速度,那么您可能应该考虑在execute调用中部署SQL,例如,您可以使用所需的结构创建一个临时结果集,清空、删除和/或更改现有表,然后从临时结果集重新填充该表:
class SQLRevisions < ActiveRecord::Migration
def change
execute "
[SQL PROCESS CALL]
[SQL PROCESS CALL]
[ETC.]"
end
end在本地测试迁移以获得预期结果,然后在生产实例上运行它。
https://stackoverflow.com/questions/7641681
复制相似问题