我写了一些与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函数编写自动测试?
答案 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。它可能更快,但它需要多个服务器和特殊的数据库设计才能实现这一性能。设置起来要困难得多。