3

我有一个应用程序需要在几个表上使用 MyISAM,但其余的都是传统的 InnoDB 类型。应用程序本身并不关心应用于这些记录的事务,但性能是一个问题。

但是,Rails 测试环境假定使用的引擎是事务性的,因此当从 schema.rb 生成测试数据库时,它会使用相同的引擎导入。是否可以以简单的方式覆盖此行为?

我采取了一种可怕的技巧,通过将其附加到 test_helper.rb 来确保表是正确的类型:

(ActiveRecord::Base.connection.select_values("SHOW TABLES") - %w[ schema_info ]).each do |table_name|
  ActiveRecord::Base.connection.execute("ALTER TABLE `#{table_name}` ENGINE=InnoDB")
end

有没有更好的方法让 MyISAM 支持的模型可测试?

4

4 回答 4

4

您可以编辑 schema.rb 并修改 create_table 调用以包含以下标志,如下所示:

create_table(:suppliers, :options => 'ENGINE=InnoDB DEFAULT CHARSET=utf8')

创建迁移时,请尝试将其添加到迁移中。我不知道当你运行 rake db:schema:dump 时这是否会坚持下去。鉴于您的经验,测试环境似乎没有正确复制开发环境,它可能不会:(

有关此处的 create_table 选项的更多信息:

http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#M001901

于 2010-04-14T09:03:57.977 回答
2

你可以设置

self.use_transactional_fixtures = false

在 test_helper.rb

于 2010-04-23T10:29:18.117 回答
2

您可以将其添加到application.rb

config.active_record.schema_format = :sql

有了这个, test db 不会有任何问题 command rake db:test:prepare。在迁移文件中,无需重新创建表(如果您需要将现有的 InnoDB 表更改为 MyISAM),您只需将其添加到up方法中:

execute("ALTER TABLE your_table ENGINE=MyISAM")
于 2013-06-04T07:01:19.613 回答
1

您可以添加此 SchemaDumper monkeypatch 以在您的 schema.rb 中显式添加引擎

https://gist.github.com/1374003

这是来自 Rails 2.3.14 的猴子补丁,因此 Rails 3 无法保证

于 2011-11-17T18:28:56.840 回答