2012年12月26日水曜日

Node.jsが面白い件⑧ MySQLの場合

NoSQLが流行っていると言っても、やはり通常業務ではMySQLを使いたいという場合もまだまだ多いと思います。私個人的には新規で作る場合はNoSQLをできるだけ使いたいと考えていますが、以下のようないろいろな事を考えるとRDBMSの選択肢は捨てられません。

  • NoSQL技術者が少ないため設計や構築、運用が難しい
  • NoSQL自体、種類がいろいろあるため選定が難しい
  • NoSQLの製品自体がまだまだ開発途上(機能追加)中である
  • 複雑なデータ処理をプログラムで記述したくない
  • 他のシステムでRDBを使っている

などなど。いろんなシチュエーションがあると思いますが、新しいものも古いものもメリットを活かして良いシステム環境を作るのがエンジニアの腕の見せ所ですね。ちなみに私はNoSQLを採用する事の最大のメリットは「アプリケーションをシンプルに考えられる」ことだと思います。データ構造をシンプルに考えると、ロジックも必要最低限のもので実装されるので余分なことを考えずに済みます。RDBMSが有効な部分もありますが、きちんと使い分けたいですね。

すこし脱線しましたが、それではMySQLを使ったプログラムを見ていこうと思います。Node.jsのMySQLドライバはいろいろありますが有名なものでdb-mysqlnode-mysqlがあります。今回はnode-mysqlを見てみましょう。

> npm install mysql@2.0.0-alpha5

ここでは上記のようにバージョン指定していますが、公式サイトを見て最適なバージョンをインストールしてください。
以下、サンプルプログラムです。

var mysql = require('mysql');

// コネクション作成
var conn = mysql.createConnection({
  host : 'localhost',
  user : 'kat',
  password : 'password',
  database : 'test'
});

// 接続
conn.connect(function(err) {
  // insert data
  conn.query(
   'insert into histories values (?), (?), (?), (?), (?), (?), (?), (?)',
   [['kat', 'astore', 'notebook', 200],
    ['yas', 'bstore', 'chair', 50000],
    ['kat', 'bstore', 'sugar', 100],
    ['kat', 'astore', 'book', 1200],
    ['ken', 'astore', 'book', 1000],
    ['kat', 'bstore', 'orange', 400],
    ['ken', 'bstore', 'apple', 700],
    ['kat', 'astore', 'pen', 200]],
   function(err, result) {
      if (err) {
        console.log('insert error');
        console.log(err);

        conn.destroy();

      } else {
        console.log(result);

        // select *
        conn.query(
          'select * from histories where user_id = ? and store_id = ?',
          ['kat', 'astore'],
          function(err, results) {
            if (err) {
            } else {
              console.log(results);

              // 切断
              conn.destroy();
            }
          }
        );
     }
   }
  );
});

node-mysqlでは現時点でコネクションプールが使えないようです。SQLを見れば明らかですが、データをinsert/selectしています。*.queryメソッドの第一引数にセットしているSQLで?を使って第二引数の値をセットしています。ドキュメントによると、この処理を行う事でescapeメソッドが呼び出され、SQL Injection攻撃の対策をしているようです(詳しくはドキュメントを参照してください)。
ORMが使いたい場合は有名なところでpersistence.jssequelizeがあり、sequelizeではコネクションプールの機能も提供されているようです。それぞれドキュメントがしっかりしているので、ORMに慣れている方は使ってみても良いですね。

0 件のコメント:

コメントを投稿