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

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

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' }],
},
})
© . All rights reserved.