Ruby on Rails迁移,将表更改为MyISAM

时间:2010-10-13 13:00:39

标签: ruby-on-rails ruby activerecord

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

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

3 个答案:

答案 0 :(得分:5)

我没有找到一个很好的方法来做到这一点。您可以像建议的人一样更改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

答案 1 :(得分:3)

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

如果我是你,我会首先对一个新应用程序进行一些测试,看看它是如何工作的。

答案 2 :(得分:0)

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

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

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