【问题标题】:Possible to simulate mysql server in memory?可以在内存中模拟mysql服务器吗?
【发布时间】:2017-11-09 15:53:52
【问题描述】:

我编写了一些与 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 函数编写自动测试?

【问题讨论】:

    标签: mysql r


    【解决方案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。它可能更快,但它需要多台服务器和特殊的数据库设计才能实现该性能。设置起来要困难得多。

    【讨论】:

    • 这看起来像是安装了 mySQL 的情况。问题是关于在 R 中的内存中有一个 mySQL。
    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2010-09-24
    • 2021-09-20
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多