Sequelizeが怖くて使えない

Node.jsで利用できるSequelize » A multi-dialect Object-Relational-Mapper for Node.JSという(現時点で唯一の?)ORMがあります。使い方にはクセがありますが、色々いじっていれば1日ほどで使えるようになるぐらいの難しさだと思います。v1.5.0時点で対応しているデータベースはMySQL、PostgresSQL、SQLiteです。適当な遊びプロジェクトを作るような時に、SQLiteが使えるというのは大変ありがたいので、ここの所、Node.js、Express、Sequelizeの組み合わせでいろいろ遊んでいました。

さて本題ですが、Sequelizeについて現時点で問題だと思う部分がありますので、挙げておきます。

どこでエスケープ処理しているのかわからない

これが実際に使う時に一番怖いところです。公式マニュアルにも書いてありますが、例えばfindのwhereで文字列を指定するときはSQLインジェクション対策*1されないので、開発者がエスケープする必要があります。

// or
Project.findAll({where: "name = 'A Project'"}).success(function(projects) {
  // the difference between this and the usage of hashes (objects) is, that string usage
  // is not sql injection safe. so make sure you know what you are doing!
})
Sequelize » A multi-dialect Object-Relational-Mapper for Node.JS

オブジェクトの場合は自動でエスケープされて、文字列での指定は自分でエスケープする、つまり、どこでエスケープするかを考える必要があるというのは、よろしくない状況だと思います。

また、プレースホルダのようなものも使えるようですが、これが、また分かりづらいです。

// search with string replacements
Project.findAll({where: ["id > ?", 25]}).success(function(projects) {
  // projects will be an array of Projects having a greater id than 25
})
Sequelize » A multi-dialect Object-Relational-Mapper for Node.JS

サンプルは、コレしかありません。

  • "?"は複数使えるのか*2
  • これはSequelize内部で置き換えられSQL文になるのか。もしそうならエスケープはされるのか。それともDB側のプレースホルダ機能が使用されるのか*3

が良く分かりません。

他にも、saveする時にエスケープ処理がされているのかもドキュメントからは分かりません。

とにかくドキュメントとサンプルが欲しい

上記以外にも、

  • エラー処理をどうすればよいのか*4
  • validate()の戻り値は一体どんな形式なのか*5

なども良く分かりません。

是非とも、ドキュメントとサンプルの拡充を図って頂きたいです。中の人よろしくお願い致します。

とはいえ

やっぱりNodeにはNoSQLの方が似合っている気がしました。

*1:適切なエスケープ

*2:使えるようです

*3:未だわかりません。ざっとソースコードも見てますが、これがまたなかなか難解で

*4:success().error()でハンドリング出来るようです。on("...", func)でも出来るようです。

*5:中身よくわかりませんが配列形式で返るらしいです。