【Prisma】Prismaで気をつけること

こんにちは、フリーランスエンジニアの太田雅昭です。

Prisma

Prismaは、TypeScriptで使えるORMです。スキーマ設計からマイグレーション、また簡単な関数でデータアクセスや更新が行えます。

Prisma | Simplify working and interacting with databases

Build, fortify, and grow your application easily with an intuitive data model, type-safety, automated migrations, connection pooling, caching, and real-time database subscriptions.

気をつけること

今回は、そんなPrismaを使用していて気になった点を書いてみます。

v5.15.1時点で、JOINは内部で行われない

内部的JOINはv5.8.0でPreview版

先に申し上げると、v5.8.0からはPreview版で、PostgreSQLで内部的にJOINを用いたクエリを投げることはできます。5.10.0からはMySQLにも対応している様です。

Relation queries (Concepts) | Prisma Documentation

Prisma Client provides convenient queries for working with relations, such as a fluent API, nested writes (transactions), nested reads and relation filters.

基本的には内部でJOINは使われない

上記はあくまでPreview版なので、本番では使わない方がいいかもしれません。このPreview版機能を使用せずに、JOINのような機能を使うと以下の様になります。

const users = await prisma.user.findMany({
  include: {
    posts: true,
  },
})

これを実行すると、まるでJOINしたかのような結果が返ってきます。しかし実際にはJOINは使われておらず、複数のSQL文が発行されます。そのためパフォーマンスは落ちることになります。速度重視の部分ではRawクエリで対応するとこになります。

Transactionは必要最低限にする

Prismaでは、以下の様にTransaction内で実行することができます。

await prisma.$transaction(async (tx) => {
    // Code running in a transaction...
})

整合性が担保されるため非常に良いのですが、中で時間がかかると複数アクセスですぐにエラーが発生します。トランザクションを持てる数が制限されているためです。この数は設定で変えれるのですが、トランザクションは本当に必要最低限にした方が良さそうです。

余談

ずいぶん暑くなってきました。エアコンは冷えすぎるので使いたくないのですが、そうも言ってられない時が近づいてきています。。。