可以在内存中模拟mysql服务器吗?

时间:2017-11-09 15:53:52

标签: mysql r

我写了一些与SQL一起使用的函数。我使用testthat和内存SQLite数据库测试函数。但是,有些函数无法使用SQLite进行测试,因为SQLite does not support the ALTER TABLE command

有没有办法在内存中模拟mySQL数据库,就像模拟SQLite一样?

> DBI::dbConnect(RSQLite::SQLite(), ":memory:")
<SQLiteConnection>
  Path: :memory:
  Extensions: TRUE
> DBI::dbConnect(RMySQL::MySQL(), ":memory:")
Error in .local(drv, ...) : 
  Failed to connect to database: Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

如果没有,如何为mySQL函数编写自动测试?

1 个答案:

答案 0 :(得分:1)

您不能像在SQLite :memory:选项中那样在内存中运行整个MySQL实例。 MySQL被设计为持久数据库服务器,而不是SQLite等短暂的嵌入式数据库。

但是,您可以将MySQL的MEMORY存储引擎用于各个表:

CREATE TABLE MyTable ( ...whatever... ) ENGINE=MEMORY;

RMySQL中的等价似乎是dbWriteTable()方法,但据我在文档中可以看出,在使用此方法创建表时,无法指定ENGINE。如果要使用MEMORY引擎,则必须在MySQL客户端中手动创建表。

但是你应该知道每个存储引擎都有一些微妙的不同行为。如果您的任何测试依赖于InnoDB的功能,您将无法使用MEMORY存储引擎模拟它们(例如行级锁定,外键,全文搜索)。

阅读MEMORY存储引擎上的手册:https://dev.mysql.com/doc/refman/5.7/en/memory-storage-engine.html

P.S。:忽略该手册页上的建议以使用NDB Cluster。它可能更快,但它需要多个服务器和特殊的数据库设计才能实现这一性能。设置起来要困难得多。