Ruby on rails Rails/MySql迁移整合
我有一个运行在MySql数据库上的Rails应用程序 有没有整合迁移的方法? 例如: 假设我有一个非常大的表,名为Ruby on rails Rails/MySql迁移整合,ruby-on-rails,rails-migrations,Ruby On Rails,Rails Migrations,我有一个运行在MySql数据库上的Rails应用程序 有没有整合迁移的方法? 例如: 假设我有一个非常大的表,名为members,我创建了一个迁移,将列name添加到该表中,然后创建另一个迁移,添加另一个字段address,并将索引添加到address字段中 现在运行迁移时,它将更改表3次:添加名称、添加地址和添加索引。在每一次中,ALTERTABLE命令实际上都会创建一个新表,将所有数据复制到其中,然后删除旧表 在我的例子中,members表非常大,超过10万条记录,因此每次更改都需要几个小时
members
,我创建了一个迁移,将列name
添加到该表中,然后创建另一个迁移,添加另一个字段address
,并将索引添加到address
字段中
现在运行迁移时,它将更改表3次:添加名称
、添加地址
和添加索引。在每一次中,ALTERTABLE命令实际上都会创建一个新表,将所有数据复制到其中,然后删除旧表
在我的例子中,members
表非常大,超过10万条记录,因此每次更改都需要几个小时
有没有办法将更改合并到一个alter中?您的问题有点难以理解,因为您不局限于每次迁移一次操作 您可以轻松地执行以下操作:
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
class AddNameAddressAndIndexToMembers
只要反转迁移,删除以前的迁移文件,运行此迁移,一切都会好起来
现在,如果您的意思是这些都是旧的迁移,那么这可能很棘手,因为您不想逆转成吨的迁移。但是你想要实现什么呢?如果您只需要部署,请使用current with您的问题有点难以理解,因为您不局限于每次迁移一次操作 您可以轻松地执行以下操作:
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
class AddNameAddressAndIndexToMembers
只要反转迁移,删除以前的迁移文件,运行此迁移,一切都会好起来
现在,如果您的意思是这些都是旧的迁移,那么这可能很棘手,因为您不想逆转成吨的迁移。但是你想要实现什么呢?如果只需要部署,使用当前的 如果您真的想要最大化速度,您可能应该考虑在执行调用中部署SQL,在该调用中,您可以创建一个临时的结果集,它具有所需的结构、空、滴和/或更改现有表,并从临时结果集中重新填充该表:
class SQLRevisions < ActiveRecord::Migration
def change
execute "
[SQL PROCESS CALL]
[SQL PROCESS CALL]
[ETC.]"
end
end
classsqlrevisions
本地测试你的迁移结果,然后在你的生产实例上运行它。
如果你真的想要最大化速度,你可能应该考虑在执行调用中部署SQL,在这个调用中你可以创建一个临时的结果集,具有你想要的结构,空,滴,和/或改变现有的表,并从临时结果集中重新填充该表:class SQLRevisions < ActiveRecord::Migration
def change
execute "
[SQL PROCESS CALL]
[SQL PROCESS CALL]
[ETC.]"
end
end
classsqlrevisions
在本地测试迁移以获得预期结果,然后在生产实例上运行迁移