先日は、mysqlxプラグインをMySQL Shellから処理して基本動作確認しました。
mysqlxとMySQL Shell初期設定と基本動作確認
本日は、mysqlxに対応しているConnector/Node.jsからMySQLにJSONデータを処理を確認してみました。
基本的には、JohannesさんがMySQL Server Blogに書いた記事をベースに検証しています。
http://mysqlserverteam.com/mysql-5-7-12-part-5-connectornode-js/
【mysqlxとConnector/Node.jsを利用する為の前提条件】
MySQL 5.7.12 or higher, with the X plugin enabled
Node.JS 4.2
Download Connector/Node.js
~概要~
Connector/Node.js is the official Node.js driver for MySQL.
MySQL Connector/Node.js is an native asychronous promise-based client library for the of
MySQL 5.7.12+ providing New CRUD APIs for Document and Relational development
http://dev.mysql.com/downloads/connector/nodejs/
設定前の各種バージョン確認
[root@misc01 nodejs]# node -v v4.4.3 [root@misc01 nodejs]# npm -v 2.15.1 [root@misc01 nodejs]#
admin@192.168.56.113 [NEW57]> select @@version; +-------------------------------------------+ | @@version | +-------------------------------------------+ | 5.7.12-enterprise-commercial-advanced-log | +-------------------------------------------+ 1 row in set (0.01 sec) admin@192.168.56.113 [NEW57]> select PLUGIN_NAME,PLUGIN_VERSION,PLUGIN_STATUS,PLUGIN_TYPE_VERSION from information_schema.plugins -> where PLUGIN_NAME = 'mysqlx'; +-------------+----------------+---------------+---------------------+ | PLUGIN_NAME | PLUGIN_VERSION | PLUGIN_STATUS | PLUGIN_TYPE_VERSION | +-------------+----------------+---------------+---------------------+ | mysqlx | 1.0 | ACTIVE | 50712.0 | +-------------+----------------+---------------+---------------------+ 1 row in set (0.01 sec) admin@192.168.56.113 [NEW57]>
ダウンロード
node.jsもMySQLもコネクター対応している事が確認出来たので、コネクターをダウンロードしてインストールしてみます。
[root@misc01 nodejs]# wget http://dev.mysql.com/get/Downloads/Connector-Nodejs/mysql-connector-nodejs-1.0.2.tar.gz --2016-04-18 11:00:12-- http://dev.mysql.com/get/Downloads/Connector-Nodejs/mysql-connector-nodejs-1.0.2.tar.gz dev.mysql.com (dev.mysql.com) をDNSに問いあわせています... 137.254.60.11 dev.mysql.com (dev.mysql.com)|137.254.60.11|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 302 Found 場所: http://cdn.mysql.com//Downloads/Connector-Nodejs/mysql-connector-nodejs-1.0.2.tar.gz [続く] --2016-04-18 11:00:18-- http://cdn.mysql.com//Downloads/Connector-Nodejs/mysql-connector-nodejs-1.0.2.tar.gz cdn.mysql.com (cdn.mysql.com) をDNSに問いあわせています... 104.78.21.123 cdn.mysql.com (cdn.mysql.com)|104.78.21.123|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 121705 (119K) [application/x-tar-gz] `mysql-connector-nodejs-1.0.2.tar.gz' に保存中 100%[==============================================================================================>] 121,705 157KB/s 時間 0.8s 2016-04-18 11:00:19 (157 KB/s) - `mysql-connector-nodejs-1.0.2.tar.gz' へ保存完了 [121705/121705] [root@misc01 nodejs]#
npmを使用してインストール
http://dev.mysql.com/doc/dev/connector-nodejs/
http://dev.mysql.com/doc/dev/connector-nodejs/tutorial-Getting_Started.html
[root@misc01 nodejs]# npm install mysql-connector-nodejs-1.0.2.tar.gz mysqlx@1.0.2 node_modules/mysqlx [root@misc01 nodejs]#
シェルのサンプルを利用した基本動作確認
[root@misc01 nodejs]# cat sample_X_API.js var mysqlx = require('mysqlx'); mysqlx.getSession({ host: 'localhost', port: 33060, dbUser: 'demo_user', dbPassword: 'password' }).then(function (session) { return session.createSchema("test_schema").then(function (schema) { return schema.createCollection("myCollection"); }).then(function (collection) { return Promise.all([ collection.add({baz: { foo: "bar"}},{foo: { bar: "baz"}}).execute(), collection.find("$.baz.foo == 'bar'").execute(function (row) { console.log("Row: %j", row); }).then(function (res) { console.log("Collection find done!"); }), collection.remove("($.foo.bar) == 'baz'").execute().then(function () { console.log("Document deleted"); }), collection.drop() ]); }).then(function () { return session.dropSchema("test_schema"); }).then(function () { return session.close(); }); }).catch(function (err) { console.log(err.stack); process.exit(); });
上記スクリプトを実行
[root@misc01 nodejs]# node sample_X_API.js Row: {"_id":"d0ef5b1d-86e6-34b2-5794-3ebcab02","baz":{"foo":"bar"}} Collection find done! Document deleted [root@misc01 nodejs]#
実行すると、以下のオブジェクトとデータがmysqlx経由(33060)でjavascriptから登録されている
admin@192.168.56.113 [test_schema]> show tables; +-----------------------+ | Tables_in_test_schema | +-----------------------+ | myCollection | +-----------------------+ 1 row in set (0.01 sec) admin@192.168.56.113 [test_schema]> select * from myCollection; +--------------------------------------------------------------------+----------------------------------+ | doc | _id | +--------------------------------------------------------------------+----------------------------------+ | {"_id": "21dddfdd-2d4e-3cf1-fc5f-05a0e9ea", "foo": {"bar": "baz"}} | 21dddfdd-2d4e-3cf1-fc5f-05a0e9ea | | {"_id": "7a7a7497-95c8-b7e7-fa15-064a8aba", "baz": {"foo": "bar"}} | 7a7a7497-95c8-b7e7-fa15-064a8aba | +--------------------------------------------------------------------+----------------------------------+ 2 rows in set (0.00 sec) admin@192.168.56.113 [test_schema]>
MySQLXのClassは以下のページを参照してください。
http://dev.mysql.com/doc/dev/connector-nodejs/NodeSession.html
その他、幾つかのパターンを検証してみましたが、node.js経由でJSONドキュメントデータをプラグイン経由で処理する事が可能なので、
JSONドキュメント処理をXプロトコル経由で高速に処理出来そうです。ただ、SQL処理とSQLX経由の処理に関しては、自分の方では実際のベンチマークは行っていないので、
Dimitriさんがブログで結果を発表してくれるのを待とうかと思います。
まだリリース間もないので、色々と情報を集めて紹介出来ればと思います。
PlanetMySQL Voting: Vote UP / Vote DOWN