Mysql 带有内存数据库的Rails

Mysql 带有内存数据库的Rails,mysql,ruby-on-rails,memory,Mysql,Ruby On Rails,Memory,我可以将rails设置为使用带有内存的mysql作为DB引擎吗?我从不重新启动mysql,而且经常重建数据库,我希望它速度更快。拥有用于运行测试的内存数据库也很好 编辑:我应该指定这仅用于开发/测试,而不是生产。我使用sqlite3内存数据库进行测试。它通常比基于文件的要快一点,但除非您有大量的测试数据,否则不会太快 要设置数据库,请执行以下操作: test: adapter: sqlite3 database: ":memory:" 您还必须将模式加载到测试助手中的内存数据库中,如下所示:

我可以将rails设置为使用带有内存的mysql作为DB引擎吗?我从不重新启动mysql,而且经常重建数据库,我希望它速度更快。拥有用于运行测试的内存数据库也很好


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

我使用sqlite3内存数据库进行测试。它通常比基于文件的要快一点,但除非您有大量的测试数据,否则不会太快

要设置数据库,请执行以下操作:

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

我不明白你为什么不能;您选择的存储引擎是一个MySQL实现细节。您只需在迁移中的create\u表中设置
:options=>“ENGINE=MEMORY”


当然,我也不明白你为什么会这样做——特别是在生产方面。内存引擎的MySQL文档就像固定长度的字段分配一样,与丢失所有内容的风险相比,您所意识到的速度增益是微不足道的。如果你的应用程序没有任何东西需要持久,那么,为什么不完全跳过AccVIECordRD,将模型放在MeMcCurp之上?

< P>为了测试的目的,考虑插件。它的使用与更新
database.yml
和运行一样简单

rails plugin install git://github.com/mvz/memory_test_fix.git
您也可以尝试安装memory\u test\u fix gem,但它来自不同的git分支,不支持Rails 3

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


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

为什么需要在测试中建立连接?我以为Rails会为你做这件事。我也做过,这很好,但由于SQLite和MySQL/PostgreSQL之间的差异,我停止在本地使用SQLite。ActiveRecord隐藏了大部分细节,但有足够的差异让它变得烦人。必须在运行测试之前建立连接,以便在加载rails之前将模式加载到内存数据库中。据我所知,加载它的唯一地方是testhelper,此时rails没有连接到数据库。如果我错了,或者有更简单的方法,请纠正我。我本来应该说,但这不是为了生产,只是为了我自己。将引擎放入迁移中不是一个选项(除非我有条件地基于环境进行迁移),所以有条件地基于环境进行迁移。为什么这不是一个选择<代码>:options=>(RAILS_ENV!='production'?“ENGINE=MEMORY”:nil)(只需确保您的测试不会因为内存引擎中存在的一些奇怪现象而中断。就我个人而言,我仍然不会为此费心;但是如果您真的认为数据库速度是您的测试瓶颈,请您自己动手。)因为我不想把所有的垃圾都放在scm上。我只想在我自己的小世界里,在本地进行,如果在我必须进行db重建或其他工作时,它能让我的工作速度加快一点,那么我就赢了,但如果不行,谁在乎,我只会使用常规设置。从答案和其他一些阅读资料来看,这项工作比它(可能甚至不值得)做的更多。尽管如此,投票并接受,因为这似乎是做这项工作的方式。