メインコンテンツにスキップ

jsonProtocol の変更

Prisma ORM バージョン 5.0.0 以降、新しい jsonProtocol がデフォルトになりました。この変更から直接生じるいくつかの変更と、新しいプロトコルに関連するいくつかの変更があります。

Prisma ORM 5 の変更の完全なリストは、リリースノートにあります。

jsonProtocol 固有の変更

以下は、Prisma ORM 5 で jsonProtocol 機能がデフォルトになったことによって直接生じる変更です。

jsonProtocol プレビュー機能の削除

Prisma ORM 5 では、jsonProtocol が Prisma Client のデフォルトかつ唯一のプロトコルです。jsonProtocol プレビュー機能は不要になりました。

Prisma ORM 4 およびそれ以前のバージョン

generator client {
provider = "prisma-client-js"
previewFeatures = ["jsonProtocol"]
}

Prisma ORM 5

generator client {
provider = "prisma-client-js"
}

エラーメッセージの改善

新しいプロトコルへの切り替えにより、いくつかのエラーメッセージが改善されました。たとえば、Prisma ORM 4 およびそれ以前のバージョンでの次のエラーメッセージは

Failed to validate the query: `Unable to match input value to any allowed input type for the field. Parse errors: [Query parsing/validation error at `Mutation.createOneUser.data.UserCreateInput.person.PersonCreateNestedOneWithoutUserInput.create`: Unable to match input value to any allowed input type for the field. Parse errors: [Query parsing/validation error at `Mutation.createOneUser.data.UserCreateInput.person.PersonCreateNestedOneWithoutUserInput.create.PersonCreateWithoutUserInput.hubspot_id`: A value is required but not set., Query parsing/validation error at `Mutation.createOneUser.data.UserCreateInput.person.PersonCreateNestedOneWithoutUserInput.create.PersonUncheckedCreateWithoutUserInput.hubspot_id`: A value is required but not set.], Query parsing/validation error at `Mutation.createOneUser.data.UserUncheckedCreateInput.person`: Field does not exist on enclosing type.]` at `Mutation.createOneUser.data`

Prisma ORM 5 では次のようになります

Invalid `prisma.user.create()` invocation in
/Users/prismo/projects/prisma/reproductions/workbench/index.ts:21:36

18 const prisma = new PrismaClient()
19
20 for (const u of userData) {
→ 21 const user = await prisma.user.create({
data: {
email: "eugene.albright@gallaudet.edu",
person: {
create: {
first_name: "William",
last_name: "Albright",
+ hubspot_id: String
}
}
}
})

Argument `hubspot_id` must not be null.

以下は、新しいプロトコルへの切り替えに関連する変更です。jsonProtocol プレビュー機能を使用していた場合、これらの問題に遭遇した可能性が非常に高いです。

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

このメジャーアップデートの一部として、いくつかの配列ショートカットが削除されました。これらのショートカットは、単一の要素を配列ベースの演算子の値として追加する方法でした。

OR 演算子

Prisma ORM 4 およびそれ以前のバージョンでの次のコードは

prisma.user.findMany({
where: {
OR: { email: 'foo@example.com' },
},
})

Prisma ORM 5 では次のように変更する必要があります

prisma.user.findMany({
where: {
OR: [{ email: 'foo@example.com' }],
},
})

OR 演算子は配列値のみを受け入れるようになります。

in および notIn 演算子

OR と同様に、in および notIn には配列値が必要です。

Prisma ORM 4 およびそれ以前のバージョン

prisma.user.findMany({
where: {
id: { in: 123 },
},
})

prisma.user.findMany({
where: {
id: { notIn: 123 },
},
})

Prisma ORM 5

prisma.user.findMany({
where: {
id: {
in: [123],
},
},
})

prisma.user.findMany({
where: {
id: {
notIn: [123],
},
},
})
単一要素に関する提案

in および notIn の値が 1 つの要素のみである場合、これらの演算子をまったく使用しないようにコードを更新することもできます

prisma.user.findMany({
where: {
id: 123,
},
})

prisma.user.findMany({
where: {
id: { not: 123 },
},
})

PostgreSQL での JSON フィールドのフィルタリングのための path 引数

PostgreSQL モデルの JSON フィールドをフィルタリングする場合path 引数は配列のみを受け入れるようになりました。

次のスキーマを使用する場合

model User {
id String @id
settings Json
}

Prisma ORM 4 およびそれ以前のバージョン

prisma.user.findMany({
where: {
settings: {
path: 'someSetting',
equals: someValue,
},
},
})

Prisma ORM 5

prisma.user.findMany({
where: {
settings: {
path: ['someSetting'],
equals: someValue,
},
},
})
情報

注: この path 引数の変更は、PostgreSQL データベースのみに影響します。MySQL データベースは、異なる構文を使用しているため影響を受けません。

スカラーリスト

スカラーリストの値は、すべての操作で配列である必要があります。

次のスキーマを使用する場合

model Post {
id String @id @default(uuid())
tags String[]
}

Prisma ORM 4 およびそれ以前のバージョン

prisma.post.create({
data: {
tags: 'databases',
},
})

prisma.post.findMany({
where: {
tags: 'databases',
},
})

Prisma ORM 5

prisma.post.create({
data: {
tags: ['databases'],
},
})

prisma.post.findMany({
where: {
tags: ['databases'],
},
})

コンポジットリスト

コンポジット型のリスト ( MongoDB 用) に対する操作は、配列値のみを受け入れるようになりました。

次のスキーマを使用する場合

model Post {
id String @id @default(uuid())
commentsList Comment[]
}

type Comment {
text String
}

Prisma ORM 4 およびそれ以前のバージョン

prisma.post.findMany({
where: {
commentsList: {
equals: { text: 'hello' },
},
},
})

Prisma ORM 5

prisma.post.findMany({
where: {
commentsList: {
equals: [{ text: 'hello' }],
},
},
})
短縮記法

短縮記法を使用し、equals を除外した場合でも、コンポジットリストフィールドには配列値を指定する必要があります。

Prisma 4 およびそれ以前のバージョン

prisma.post.create({
data: {
commentsList: { text: 'hello' },
},
})

prisma.post.findMany({
where: {
commentsList: { text: 'hello' },
},
})

Prisma 5

prisma.post.create({
data: {
commentsList: [{ text: 'hello' }],
},
})

prisma.post.findMany({
where: {
commentsList: [{ text: 'hello' }],
},
})