Node.jsのORMについて
概要
Node.jsにはORMが沢山存在します
ここではNode.jsに存在するいくつかのORMについて紹介します
前置き
筆者はここ半年〜1年近くNode.jsでバックエンドを書いていないです。ですので、ここの情報は最新の状態を反映していない可能性があります。
また、ここにある内容はあくまで筆者個人の意見や見解に基づいたものです
Sequelize
(スター数から判断すると) 多分、一番人気なのかな❓ (2021/01現在)
Active Recordパターンを採用しているため、RailsやLaravelなどの経験がある方は使いやすいかも🙆‍♂️
TypeScriptとの相性が若干微妙な印象
TypeScriptが登場する前に開発されたので、仕方がない🙆‍♂️
最後に使ったのが3年近く前なので、もしかしたら現在は改善されているかも...
逆に通常のJavaScriptで使用する分には普通にありだ思います🙆‍♂️
とはいえ、非同期処理とかが関係してくる都合上、どうしてもRailsのactiverecord程の使い勝手を得るのは難しいという印象...😖
TypeORM
Active Record/Data Mapperの両方のデザインパターンを採用しており、小規模〜大規模まで幅広く使用できることが意識されています
TypeScriptとの相性が良い🙆‍♂️
ネックがあるとすれば、以下のような点かと思います:
2021/01現在、まだメジャーリリースされていない (メジャーリリースまでにまだ破壊的変更が起こる可能性が考えられます)
Decorator metadataなどの実験的機能に依存
正確に言うと、TypeORMにはEntitySchemaという機能があり、これを使えば、デコレータやDecorator metadataに依存せずにマッピングを定義することも可能です
個人的には一番好み🙆‍♂️
Prisma
正直に言うと、使ったことがないので詳しくないです😖
現時点だと最も勢いがあるORMなのかな❓
TypeScriptとの相性はTypeORMよりも良さそうな気がする🙆‍♂️
blitzがPrismaを採用しているみたいなので、伸びるかも❓
Objection.js
Knex.jsをベースにしたORM
Knex.jsが提供している機能は一通り使用できる(クエリビルダ、マイグレーション、シード等)
Sequelize同様、Active Recordパターンを採用
SequelizeよりもTypeScriptとの相性がよい印象
insertGraphやupsertGraphがとても強力
インテグレーションテストを書きやすい
code:typescript
import { Model, transaction } from 'objection';
describe('...', () => {
let trx, knex;
beforeEach(async () => {
knex = Model.knex();
trx = await transaction.start();
Model.knex(trx);
});
afterEach(async () => {
await trx.rollback();
Model.knex(knex);
});
it('...', async () => {
...
});
});
個人的な結論
安定性や枯れたORMを求めるのであれば、Sequelizeがよいと思います。
現時点では、TypeORMがよいと思っています(TypeScriptとの相性/完成度の高さ/GitHubのスター数などの観点から)
PrismaとTypeORMについては、そもそも採用しているデザインパターンが違うと思うので、棲み分けはできると思っています。