Rails与内存数据库

时间:2009-10-21 18:00:00

标签: mysql ruby-on-rails memory

我可以设置rails使用mysql和MEMORY作为数据库引擎吗?我从不重启mysql,并且经常重建数据库,我宁愿让它快速。让内存数据库运行测试也很不错。

编辑:我应该指定这只是开发/测试,而不是生产。

3 个答案:

答案 0 :(得分:6)

我不明白为什么你不能;您选择的存储引擎是MySQL的实现细节。您需要做的只是在迁移中的 create_table 声明中设置:options => "ENGINE=MEMORY"

当然,我也不明白为什么你 - 特别是在制作中。 MEMORY引擎的MySQL文档是full of caveats,就像固定长度的字段分配一样,与丢失所有内容的风险相比,你所意识到的速度增益必须微不足道。如果您的应用程序不需要保留任何内容,那么为什么不完全跳过ActiveRecord并将模型分层到Memcached之上?

答案 1 :(得分:2)

我在内存数据库中使用sqlite3进行测试。它通常比基于文件的速度快一点,但除非你有大量的测试数据,否则不会那么多。

要设置你的database.yml将如下所示:

test:
adapter: sqlite3
database: ":memory:"

您还必须将模式加载到测试助手中的内存数据库中,如下所示:

config = YAML::load(IO.read(File.dirname(__FILE__) + "/../config/database.yml"))
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/../log/debug.log")
ActiveRecord::Base.establish_connection(config["test"])
load(File.dirname(__FILE__) + "/../db/schema.rb")

答案 2 :(得分:1)

出于测试目的,请考虑https://github.com/mvz/memory_test_fix插件。它的用法就像更新database.yml和运行

一样简单
rails plugin install git://github.com/mvz/memory_test_fix.git

您也可以尝试安装memory_test_fix gem,但它来自不同的git分支,不支持Rails 3.

gem帮助我将测试用例执行时间从25秒减少到19.另一方面,它在数据库模式初始化时引入了2秒的开销(我没有那么多)。因此,在小型测试中,不值得打扰。

Jason Stewart的回答基本相同。我使用它而不是插件,因为它更容易与Spork插件结合使用。