node.jsのいろいろなモジュール33 – squelでSQLを組み立てる
はじめに
nodeでRDBへアクセスする方法
nodeといえば、mongoDBやredis等のKVSといっしょに使用するケースが多いですが、RDBMSとやり取りすることも多々あります。 その際、nodeから、各種RDBMSへアクセスする方法はいくつかあります。 こういったORMモジュールを使ったり、以前も紹介したDB用モジュールを使ったりします。 ORMで簡単DBアクセスでもいいのですが、手軽に使うにはやはりSQLを書いて実行するのが楽ではないでしょうか。 今回は、RDBMSへSQLを使ってアクセスする際、簡単にSQLを組み立てるモジュールを紹介します。
squelとは
今回紹介するsquelモジュールは、SQL文字列を生成するための「SQLビルダ」です。 node/ブラウザどちらでも動作し、標準のSQL文字列を生成するためのヘルパ関数を提供してくれます。 SQLビルダなので特定のDBに依存せず、サイズも軽量なモジュールです。環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.5
- Node.js : v0.10.4
- npm : 1.2.18
npmを使用してモジュールをインストールしましょう。
% mkdir squel % cd squel % npm install squel
サンプルプログラム作成
squelモジュールは、requireしたモジュールをselect関数やfrom関数を指定して、SQLを組み立てていきます。 次のサンプルは、t_userテーブルのSQL文字列を生成しています。 実行すると、「SELECT * from t_user」という文字列が生成されます。
//app.js var squel = require("squel"); //SELECT文を生成 var sql = squel.select() .from("t_user") .toString(); console.log("SQL =",sql);
多少複雑なSQLも次のように簡単に生成可能です。 関数をチェインして必要な条件を足していきます。
// SELECT tu.id, tu.name AS "n" FROM t_user `tu` // INNER JOIN t_dept `td` ON (tu.id = td.userId) WHERE (tu.name = 'taro') ORDER BY id ASC squel.select() .from("t_user", "tu") .field("tu.id") .field("tu.name", "n") .join("t_dept", "td", "tu.id = td.userId") .order("id") .where("tu.name = 'taro'") .toString()
INSERT/UPDATE/DELTEのSQLも次のとおり生成可能。
// UPDATE文 // UPDATE t_user SET name = 'takeshi' WHERE (name = 'taro') squel.update() .table("t_user") .set("name", "takeshi") .where("name = 'taro') .toString() // INSERT文 // INSERT INTO t_user (id, name) VALUES (1, 'hanako') squel.insert() .into("t_user") .set("id", 1) .set("name", "hanako") .toString() // DELETE文 // DELETE FROM t_user WHERE (id = 1) squel.delete() .from("t_user") .where("id = 1") .toString();
まとめ
さて、今回はsquelモジュールを使用して、基本的なSQL文字列を生成してみました。 expr()関数、or関数、and関数を組み合わせば、複雑なwhere句を生成できますし、 既存の関数をオーバーライドすることでカスタムクエリを生成させることもできます。 文字列をつなげてSQLを書くより、このモジュールをつかってSQLを生成するのが楽ですね。