2009-10-21 47 views
11

我可以设置rails以将MEMORY作为数据库引擎使用mysql吗?我从不重新启动mysql,并且经常重建db,我宁愿让它速度更快。拥有运行测试的内存数据库也不错。内存数据库中的Rails

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

回答

6

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

当然,我也看不出为什么你 - 特别是在生产。 MEMORY引擎的MySQL文档是full of caveats,就像固定长度的字段分配一样,与丢失所有内容的风险相比,您意识到的速度增益已经变得微不足道了。如果您的应用程序无需持久保存,那么为什么不直接跳过ActiveRecord并将您的模型放在Memcached之上?

+0

我原本应该说,但这不是生产,只是我发展。将引擎引入迁移并不是一种选择(除非我有条件地根据环境进行) – 2009-10-22 17:25:10

+0

因此,请根据环境条件进行。为什么这不是一个选项? ':options =>(RAILS_ENV!='production'?“ENGINE = MEMORY”:nil)'(只要确保你的测试不会被一些只存在于内存引擎中的奇怪现象所抛弃。就我个人而言,我仍然不会为此而烦恼。但是如果你真的认为数据库速度是你的测试瓶颈,那么就自己敲一下吧。) – SFEley 2009-10-22 18:47:08

+1

因为我不想提交迁移到SCM的所有那些废话。我想在本地,在我自己的小世界中做,如果它在事情发生时让我的事情变得更快,那么我必须做db重建或什么的,然后赢,但如果没有,谁在乎,我只是用定期安装。 从答案和其他一些阅读来看,它的工作量比其(甚至可能不值)要多。 – 2009-10-23 06:17:42

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") 
+0

为什么你需要在测试中建立连接?我认为这是Rails会为你做的。 – 2009-10-21 20:47:21

+0

我也这样做过,它很好,但由于它与MySQL/PostgreSQL的区别,我在本地停止使用SQLite。 ActiveRecord隐藏了大部分细节,但有足够的区别让它变得烦人。 – 2009-10-22 14:23:59

+0

在运行测试之前必须建立连接,以便可以在加载rails之前将模式加载到内存数据库中。 我知道加载它的唯一地方是在测试帮助器中,此时没有通过导轨与数据库建立连接。如果我错了,请纠正我,或者如果有更简单的方法去做。 – 2009-10-22 20:47:50

1

用于测试目的考虑https://github.com/mvz/memory_test_fix插件。它的使用一样容易更新database.yml和运行

rails plugin install git://github.com/mvz/memory_test_fix.git 

您可以尝试还安装memory_test_fix宝石,但是它从不同的Git分支的和不支持的Rails 3

宝石帮我减少测试案例执行时间从25秒到19秒。另一方面,它引入了2秒的数据库模式初始化开销(我没有那么多)。所以在小组测试中,这不值得打扰。

杰森斯图尔特的答案的解决方案基本相同。我用它代替了插件,因为它更容易与Spork插件结合使用。