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

标签 mysql r

我编写了一些与 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/

相关文章:

python - jsonify 上的值错误

php - 从三个表中进行 SQL SELECT,并在投票系统中进行排序

递归累积函数

r - 包中的年份::huxtable 表脚注默认为科学记数法

javascript - 如何在鼠标悬停时的弹出窗口中显示放大的图像,或者在 RShiny 的 rhandsontable 单元格中显示的图像上的单击事件上显示放大的图像?

php - 如何在 "or"部分编写自定义 "where"条件; zf2 Zend框架

mysql - SQL:将 View 连接到表以进行查询

mysql - mysql中的更新替换命令

css - 使用 rvest 抓取所选下拉项的文本

r - R中的加权随机数生成