【问题标题】:Ruby on Rails migration, change table to MyISAMRuby on Rails 迁移,将表更改为 MyISAM
【发布时间】:2010-10-13 13:00:39
【问题描述】:

如何正确创建 Rails 迁移,以便在 MySQL 中将表更改为 MyISAM?目前是 InnoDB。运行原始执行语句会更改表,但不会更新 db/schema.rb,因此当在测试环境中重新创建表时,它会返回到 InnoDB 并且我的全文搜索失败。

如何更改/添加迁移,以便将现有表修改为 MyISAM 并更新 schema.rb,以便相应地更新我的数据库和相应的测试数据库?

【问题讨论】:

  • 为什么不想更新 schema.rb ?您可以编辑 schema.rb 并修改 create_table create_table(:table, :options => 'ENGINE=MyISAM DEFAULT CHARSET=utf8')
  • Schema.rb 将被覆盖,并且它不会包含将表添加到 MyISAM 的更新。
  • 你想要这个只用于单个表还是数据库中的所有表?如果所有表都可以让create_table 默认为 MyISAM。
  • 单表,需要Mysql支持FULLTEXT搜索。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

我没有找到一个很好的方法来做到这一点。您可以像有人建议的那样更改您的 schema.rb,然后运行:rake db:schema:load,但是,这会覆盖您的数据。

我这样做的方式是(假设您正在尝试转换一个名为 books 的表格):

  1. 从 CLI 保存现有数据:CREATE TABLE tmp SELECT * FROM books;

  2. 在您的新迁移文件中,删除 books 表并使用 :options => "ENGINE=MyISAM" 重新创建它,就像评论中所说的那样

  3. 将内容复制回来:INSERT INTO books SELECT * FROM tmp

【讨论】:

    【解决方案2】:

    我认为如果您将架构格式 (config.active_record.schema_format) 从 :ruby 更改为 :sql,所有 sql 都将保存在那里。

    如果我是你,我会先在新应用上做一些测试,看看它是如何工作的。

    【讨论】:

      【解决方案3】:

      您可以在迁移中运行任何 sql。这对我有用:

      class ChangeMapOnlyUsersEngine < ActiveRecord::Migration[5.1]
        def change
          MyModel.connection.execute("ALTER TABLE my_models ENGINE = 'MyISAM';")
        end
      end
      

      当我在另一个方向(InnoDB -> MyISAM)这样做时,它运行良好,没有丢失数据,所以我认为没有必要创建临时表或类似的表。请注意,MyISAM 不支持事务,因此任何针对相应 ActiveRecord 模型的数据库测试都将被持久化,存在测试污染的风险。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-09
        • 2019-12-24
        • 1970-01-01
        • 1970-01-01
        • 2012-11-11
        • 1970-01-01
        • 2010-12-29
        相关资源
        最近更新 更多