node.jsのいろいろなモジュール33 – squelでSQLを組み立てる

2013.05.07

この記事は公開されてから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を生成するのが楽ですね。

参考サイトなど