この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
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を生成するのが楽ですね。