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年最初の記事。。