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插件结合使用。