首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails/MySql迁移整合

Rails/MySql迁移整合
EN

Stack Overflow用户
提问于 2011-10-04 07:07:37
回答 2查看 251关注 0票数 0

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

有没有合并迁移的方法?例如:

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

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-04 07:36:32

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

您可以轻松地执行以下操作:

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 2012-09-11 05:32:28

如果您确实希望最大限度地提高速度,那么您可能应该考虑在execute调用中部署SQL,例如,您可以使用所需的结构创建一个临时结果集,清空、删除和/或更改现有表,然后从临时结果集重新填充该表:

代码语言:javascript
运行
复制
class SQLRevisions < ActiveRecord::Migration
    def change
        execute "
            [SQL PROCESS CALL]
            [SQL PROCESS CALL]
            [ETC.]"
        end
    end

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7641681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档