Node のアプリケーションから RDB を利用する。

こんにちは、Swift 2.0 と watchOS 2 が気になっている三宅ですが、今回も Node.js についてです。

Node.js のアプリケーションといえば MongoDB というイメージが強いですが、従来の RDB を利用したい場面も出てくると思います。
とくに Heroku では Heroku Postgres がオフィシャルで提供されており、 PGBackups や Fork などの便利な機能を利用することができます。
そこで今回は Node のアプリケーションで RDB を使う際に便利な、次の 3 つのプラグインを紹介したいと思います。

  1. Sequelize
  2. Sequelize CLI
  3. Epilogue

Sequelize

Sequelize は PostgreSQL をはじめ、MySQL や MariaDB、SQLite へのアクセスを提供する Node.js のライブラリです。

sequelize/sequelize

オブジェクトとテーブル間の関連の定義を行う ORM 機能、モデルの定義に基づくテーブルの自動生成、トランザクションなどの機能を提供します。
また、モデルへのアクセスやテーブルの操作などは Promise ベースのメソッドで提供されており、Node のプログラミングスタイルとマッチしていて違和感なく利用することができます。

npm でインストールすることができ、各 DB へアクセスするためのライブラリを合わせてインストールするだけで使い始めることができます。
以下は PostgreSQL で利用する場合のコマンドです。

$ npm install --save sequelize
$ npm install --save pg pg-hstore

開発も活発でドキュメントも詳しく、安心して利用することができると思います。
Seqeulize

Sequelize CLI

継続的な開発やチーム開発などでは、データベースのマイグレーションの管理が重要となってきます。
Sequelize 単体でも定義されたモデルに基づきテーブルを変更する機能は提供されていますが、バージョン管理などを行うことはできません。
sequelize/cli はデータベースへの変更をコードとして定義し、バージョン管理を容易にするためのコマンドラインツールです。

$ npm install -g sequelize-cli

gulp や Grunt と同様に、コマンドを利用するためにグローバルにパッケージをインストールする必要があります。
Heroku などグローバルにインストールできない環境ではローカルにインストールし、node_modules/.bin 以下の実行モジュールを指定してコマンドを実行してください。

Seqeulize CLI では、マイグレーション定義に基づくマイグレーションの実行、モデルの作成と対応するマイグレーション定義の生成などを行う事ができます。

$ seqeulize init

上記のコマンドでモデルを定義するディレクトリや DB 接続の設定を行うファイルが生成され、CLI の機能を利用する準備が整います。

モデルの作成は以下のように行います。

$ sequelize model:create --name User --attributes first_name:string,last_name:string

/models 配下に user.js が作成されるのとともに、/migrations の下にマイグレーションのためのコードが記述されたファイルが生成されます。
そして、以下のコマンドでマイグレーションを実行します。

$ seqeulize db:migrate

DB には自動的にマイグレーションの実行履歴を管理するためのテーブルが作成され、実行されたマイグレーションの履歴が管理されます。
これらのファイルをバージョン管理する事で、データベースも含めアプリケーションを任意のバージョンに戻す事ができ、またアプリケーションのデプロイ環境の切り替えが容易になります。

Epilogue

dchester/epilogue は Express や Restify のアプリケーションに対し、 Seqeulize のモデルに基づく REST API を作成するためのライブラリです。

var epilogue = require('epilogue');

epilogue.initialize({
  app: app,
  seqeulize: seqeulize
});

var userResource = epilogue.resource({
  model: User,
  endpoint: ['/users', '/users/:id']
});

上記のコードで、Seqeulize で定義した User の REST API が作成されます。
モデルとエンドポイントの指定が必要となるため、モデルの数が多くなると煩雑になってしまうのですが定型的なエンドポイントの名前で構わないのであれば、以下のコードで一気に作成する事ができます。

// 英単語の複数形を取得する事ができる npm ライブラリ
var plural = require('plural');

// Seqeulize が作成した models ディレクトリへのパス
var db = require('../models');

// Resource オブジェクトを保持するオブジェクト
var resources = {};

Object.keys(db.sequelize.models).forEach(function(modelName) {
  var apiName = plural(modelName.toLowerCase());
  var resource = epilogue.resource({
    model: db[modelName],
    endpoints: ['/api/' + apiName, '/api/' + apiName + '/:id']
  });
  resources[modelName] = resource;
});

Seqeulize によって作成される models/index.js は定義済みのデータベース接続情報によって作成された Seqeulize のオブジェクトを保持するオブジェクトをエクスポートしています。
seqeulize オブジェクトは定義されたモデルをモデル名をキーとした models オブジェクトを保持しているので、そのオブジェクトをもとに REST API を作成します。
上記の例では、モデル名を小文字にして複数形にした上で、/api/{models} の形で REST API を作成しています。

開発の初期段階などで、とりあえずモデルの CRUD を行うための API を用意したいときなどには有効かと思います。


今回は Node で RDB を利用する際に便利なライブラリを紹介しました。
MongoDB と mongoose の組み合わせはよく紹介されていますが、もちろん、RDB も利用することができます。
今のプロジェクトでは Express + Seqeulize + Heroku Postgres の組み合わせで開発を進めています。
その際に気づいたことがあれば、またこの場で共有できればと思います。

コメント(0)