Sequelize チップス

#node, #sequelize

Node 案件で ORM の Sequelize を使用しました。
公式のドキュメントに書いてあったりなかったり、Sequelize に関する備忘録を残します。

1. Sequelize で使用している DB インスタンスを取得する

ORM を通すよりは直接 DB インスタンスからクエリ流した方が速いので、使用しているインスタンス取れないかなぁと思ってソース見たらメソッドが用意されておりました。

1
2
3
4
5
6
7
8
sequelize.connectionManager.getConnection().then((db) => {
db.get('SELECT name FROM hoge WHERE id = 1', (err, result) => {
if (err) {
return;
}
console.log(result.id);
});
});

ポイント

  • getConnection すると Promise が返る
  • コールバックの第 1 引数に DB インスタンスが入る
  • API は各 DB に依存する

2. Sequelize でトランザクション管理

複数モデルの update を 1 トランザクションで流して、全て実行した後 Promise の結果を受け取ります。Promise.each がキモ。Bluebird ありがとう。

1
2
3
4
5
6
7
8
9
sequelize.transaction((t) => {
return sequelize.Promise.each(models, (model) => {
return model.update(updates, {transaction: t});
});
}).then((result) => {
// コミットしたらこっち
}).catch(() => {
// ロールバックしたらこっち
});

3. エスケープ処理する

1 とも関係しますが、シビアにパフォーマンスが要求される場面で ORM の機能は使わずクエリをそのまま流したかったのでエスケープ処理を入れる必要がありました。

1
sequelize.escape(req.params.user_id);

Sequelize 意外と痒いところに手が届きます。
Promise ベースで記述できるのも Good :D

気づけば 2016 年最初の記事。。