🎉

Prisma 5がリリースされたよ

2023/07/14に公開

はじめに

普段、仕事でも使用しているPrismaの新バージョンPrisma 5がリリースされました。
その変更点を簡潔にまとめてみます。

https://github.com/prisma/prisma/releases/tag/5.0.0

プレビューから一般提供になった機能

次の機能がプレビューから一般提供になり、デフォルトで使用可能になりました。

jsonProtocol

Prisma Clientとクエリエンジンの間でjsonProtocolがデフォルトで使用されるようになりました。

以前は、GraphQLライクなプロトコルが使われていましたが、スキーマが大きい場合にCPUとメモリの消費が大きく、パフォーマンスのボトルネックとなる問題がありました。
JSONベースのワイヤープロトコルの導入により、特にコールドスタートのリクエストにおいて、通信が大幅に効率化されるようになりました。

同じテーブルのカラム同士の比較

同じテーブルのカラム同士を比較することが可能になりました。

例えば、以下のクエリは商品の数量の(quantity)が警告の値(warnQuantity)に達したレコードを取得します。

await prisma.product.findMany({
  where: { 
    quantity: { lte: prisma.product.fields.warnQuantity } 
  },
})

ユニークなレコードの取得におけるユニークではないカラムでのフィルタリング

findUniqueupdatedeleteなど、ユニークなレコードを操作するクエリのwhere句に、ユニークでない列を使用することが可能になりました。

例えば、以下のようなモデルがあった場合、バージョンによるフィルタリングを以前はできませんでした。

 model Article {
  id      Int    @id @default(autoincrement())
  content String
  version Int
}

Prisma 5からは、バージョンのようなユニークでないカラムでもフィルタリングを行うことが可能になりました。

await prisma.article.findUnique({
  where: { 
    id: 5, 
    version: 1 // filter on the `version` field was not available before Prisma 4.5.0
  },
});

依存関係のバージョンの変更

Prismaが必要とするNode.js、TypeScirpt、PostgreSQLの最小バージョンが更新されました。

  • Node.js 16.13.0 以上
  • TypeScript 4.7 以上
  • PostgreSQL 9.6 以上

また、PrismaClient内部のSQLiteのバージョンが3.41.2に上がりました。

修正が必要な変更点

次の変更があったので、必要に応じてコードを修正する必要があります。

対応について詳細はPrisma 5へのアップレードガイドを参照してください。

配列のショートカットの削除

Prisma 4までは、配列を指定する場面で要素が単一の場合、配列ではなく要素を直接指定できました。
しかし、型付けの一貫性のために、Prisma 5からは要素が1つでも必ず配列で渡さなければいけなくなりました。

Prisma 5で削除されたショートカットは以下の通りです。

  • OR演算子のショートカット
  • in演算子、notIn演算子のショートカット
  • PostgreSQLのJSONpathフィールドのショートカット
  • スカラーリストのショートカット
  • MongoDBのコンポジットタイプのショートカット

以下はOR演算子の例です。

await prisma.user.findMany({
  where: {
-    OR: { email: 'alice@prisma.io' }
+    OR: [{ email: 'alice@prisma.io' }]
  }
})

Prisma Clientのruntime/index.jsの削除

Prisma 5では、Prisma Clientからruntime/index.jsが削除されました。

@prisma/client/runtimeをimportしている場合、以下のような修正が必要です。

- import { Decimal } from '@prisma/client/runtime'
+ import { Prisma } from '@prisma/client'

// Usage update of Prisma Client's utilities
- Decimal
+ Prisma.Decimal

非推奨の項目の削除

以下の非推奨の項目が削除されました。

  • Prisma Client
    • rejectOnNotFoundパラメータの削除
  • Prisma CLI
    • 非推奨なフラグの削除
      • --preview-feature
      • --experimental--early-access-feature
      • --force
      • --experimental-reintrospection--clean
  • Prisma Schema
    • experimentalFeaturesジェネレータプロパティの削除
  • その他
    • prisma2という名前の実行ファイルを削除

その他の変更

その他、以下の変更がありました。

  • CockroachDBに接続する場合はcockroachdbプロバイダの使用が必須になった
    • postgresqlでも接続できていたのは廃止
  • ライブラリのクエリエンジンのbeforeExitフックの削除
    • 代わりにNode.jsの終了イベントを使用する
  • migration-engineschema-engineに名前を変更
    • 大半のユーザーには影響ない変更
    • serverless.ymlのpackageの指定など、一部のケースで影響を受ける場合がある

おわりに

jsonProtocolの採用によるパフォーマンス向上はうれしいですね。
同じテーブルのカラム同士の比較やユニークではないカラムでのユニークな項目の取得も、そのうち使う場面が出てきそうです。

既存の実装への影響範囲を確認しつつ、積極的にアップデートしたいと思います。

株式会社モニクル

Discussion