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
関連の変更
以下は、新しいプロトコルへの切り替えに関連する変更です。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' }],
},
})