Rails与内存数据库

我可以将rails设置为使用带有MEMORY的mysql作为数据库引擎吗? 我从来没有重新启动mysql,并且经常重建数据库我宁愿让它快速。 让内存db运行测试也会很好。

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

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

当然,我也不明白你为什么 – 尤其是在制作中。 MEMORY引擎的MySQL文档充满了警告 ,例如固定长度的字段分配,与丢失所有内容的风险相比,你意识到的速度增益必须微不足道。 如果您的应用程序不需要持久保存,那么为什么不完全跳过ActiveRecord并将模型分层到Memcached之上?

我在内存数据库中使用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") 

出于测试目的,请考虑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插件结合使用。