Objection.js とは、Node.jsの ORM で、使いやすい。
Node.js の ORM 事情
Knex というクエリビルダーがあり、それに基づいているものが多い。 Sequelize.js だけは独自実装。
Sequelize.js
最もスター数が多いが、難しい。ドキュメントが読みにくい。
Bookshelf.js
こちらも老舗で、使いやすそうだと思ったのだが、Bookshelf.js は死んだ...
...らしい。
が、生き返ろうとしているらしい。
Objection.js
後発で、最も良さそうだった。Sequelize よりも直感的だと思う。 TypeScript にも対応している。
他のORMが、 Python の SQLAlchemy や Django のモデルとすると、Rails や Laravel のモデルに近い。テーブル名を指定すると、自動的にメソッドやプロパティが生える?ような挙動。(コード読んでないので、どんな実装かは存じ上げません・・・)
ちなみにQiitaで見たら、このライブラリに自体に言及している記事が1件もなかった。
TypeScript に対応しているのが良くて、他のライブラリだと、独自の型定義を指定するので、それを調べるのがちょっと面倒。また、上述した、自動的に生えるプロパティに対して、型を指定できるので、型の有無の良いところを取っているように思える。
Mongoose
本命ですね。
MongoDB に絞られますが、 Node.js 使うならこれが一番使いやすいと思った。
そもそも Node.js が求められる場合というのは、 C10K 問題の解決のため、というのもあるだろうし、 RDB に固執するのはもはや煩悩の域なのかもしれない。
問題
その Objection.js で一つハマったので、メモ。
モデル
class User extends Model {
id?: number
name?: string = ''
email?: string
}
コントローラー
app.put('/users/:id', async(req, res) => {
await User.query()
.patch({ email: 'hoge@hoge.com' })
.where('id', 1)
res.send('ok')
})
などとすると、下記のSQLが出る
SQL update `users` set `name` = ?, `email` = ? where `id` = ? {, 'hoge@hoge.com, 1} 8.906ms
name?: string = ''
で、デフォルト値を設定していると、 Update 時にもそれが代入されてしまう。んー。 Create 時ならいいんだけどなあ。