如何正确创建Rails迁移,以便在MySQL中将表更改为MyISAM?它目前是InnoDB。运行原始执行语句将更改表,但它不会更新db / schema.rb,因此当在测试环境中重新创建表时,它将返回到InnoDB并且我的全文搜索失败。
如何更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库相应更新?
答案 0 :(得分:5)
我没有找到一个很好的方法来做到这一点。您可以像建议的人一样更改schema.rb,然后运行:rake db:schema:load
,但这会覆盖您的数据。
我这样做的方式是(假设您正在尝试转换一个名为books的表格):
保存CLI中的现有数据:CREATE TABLE tmp SELECT * FROM books;
在新的迁移文件中,删除books表并使用:options => "ENGINE=MyISAM"
重新创建它,就像有人在评论中所述
将内容复制回来: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 模型的数据库测试都将被持久化,存在测试污染的风险。