2017-11-09 6 views
0

私はSQLで動作するいくつかの関数を書いています。私はtestthatとメモリ内のSQLiteデータベースを使って関数をテストします。ただし、一部の関数はSQLite does not support the ALTER TABLE commandのためSQLiteを使用してテストすることはできません。メモリ内にmysqlサーバをシミュレートできますか?

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関数の自動テストをどのように記述しますか?

答えて

1

MySQLインスタンス全体をSQLite :memory:オプションのようにメモリ内で実行させることはできません。 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のを使用するためにそのマニュアルページの提案を無視します。より速いかもしれませんが、そのパフォーマンスを達成するには複数のサーバーと特別なデータベース設計が必要です。セットアップがはるかに難しいです。

+0

これは、mySQLがインストールされている場合のように見えます。問題は、R. – Deleet

+0

@Deleetの中からメモリにmySQLを置くことです。上の私の更新された答えを見てください。 –

関連する問題