我编写了一些与 SQL 配合使用的函数。我使用 testthat
和内存 SQLite 数据库测试这些函数。但是,某些函数无法使用 SQLite 进行测试,因为 SQLite does not support the ALTER TABLE
command .
是否有某种方法可以像模拟 SQLite 一样在内存中模拟 mySQL 数据库?
> 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 函数编写自动测试?
最佳答案
你不能像 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 的建议。它可能会更快,但需要多个服务器和特殊的数据库设计才能实现该性能。设置起来要困难得多。
关于mysql - 可以在内存中模拟mysql服务器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47206204/