LoginSignup
4
3

More than 5 years have passed since last update.

Objection.js で、 モデルにデフォルト値を設定していて更新時に困った

Last updated at Posted at 2018-07-03

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が出る

knex-logger
SQL update `users` set `name` = ?, `email` = ? where `id` = ? {, 'hoge@hoge.com, 1} 8.906ms

name?: string = '' で、デフォルト値を設定していると、 Update 時にもそれが代入されてしまう。んー。 Create 時ならいいんだけどなあ。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3