jsonProtocol 更改
从 Prisma ORM 版本 5.0.0 开始,新的 jsonProtocol
是默认协议。此更改直接导致了一些更改,还有一些更改与新协议相关。
可以在 我们的发行说明 中找到 Prisma ORM 5 的所有更改列表。
jsonProtocol
特定更改
以下是 jsonProtocol
功能在 Prisma ORM 5 中成为默认功能直接导致的更改。
删除 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: "[email protected]",
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: '[email protected]' },
},
})
需要在 Prisma ORM 5 中更改为以下内容
prisma.user.findMany({
where: {
OR: [{ email: '[email protected]' }],
},
})
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' }],
},
})