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
の値が単一の要素である場合、これらの演算子を全く使用しないようにコードを更新することもできます。
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' }],
},
})