跳到主要内容

排除字段

默认情况下,Prisma 客户端返回模型中的所有字段。可以使用 select 缩小结果集,但如果模型很大并且只想排除一两个字段,这可能很麻烦。

信息

从 Prisma ORM 5.16.0 开始,支持通过 omitApi 预览功能全局和本地排除字段。

使用 omit 全局排除字段

以下是如何使用 omitApi 预览功能 全局排除字段的类型安全方法

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

model User {
id Int @id @default(autoincrement())
firstName String
lastName String
email String @unique
password String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}

使用 omit 本地排除字段

以下是如何使用 omitApi 预览功能本地排除字段的类型安全方法

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

model User {
id Int @id @default(autoincrement())
firstName String
lastName String
email String @unique
password String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}

如何排除多个字段

排除多个字段的工作原理与选择多个字段相同:在 omit 选项中添加多个键值对。使用与之前相同的模式,可以使用以下方法排除密码和电子邮件

const prisma = new PrismaClient()

// password and email are excluded
const user = await prisma.user.findUnique({
omit: {
email: true,
password: true,
},
where: {
id: 1,
},
})

可以在本地和全局排除多个字段。

如何选择以前被排除的字段

如果 全局排除字段,则可以通过专门选择字段或在查询中将 omit 设置为 false 来“覆盖”。

const user = await prisma.user.findUnique({
select: {
firstName: true,
lastName: true,
password: true // The password field is now selected.
},
where: {
id: 1
}
})

何时在全局或本地使用 omit

了解何时在全局或本地排除字段非常重要

  • 如果要排除字段以防止它意外包含在查询中,最好全局排除它。例如:全局排除 User 模型的密码字段,以防止敏感信息意外泄露。
  • 如果要排除字段是因为它在查询中不需要,最好在本地排除它。

本地排除(在查询中提供 omit 选项时)仅适用于定义它的查询,而全局排除适用于使用相同 Prisma 客户端实例进行的每个查询,除非使用特定选择或覆盖排除

在不使用 omit 的情况下排除密码字段

注意

在 Prisma ORM 5.13.0 中发布的 omitApi 预览功能是首选的从查询结果中排除字段的方法。在 Prisma ORM 5.16.0 中,omitApi 预览功能中添加了全局排除字段的功能。此文档对于 Prisma ORM 5.13.0 之前的版本仍然适用。

以下是一个类型安全的 exclude 函数,它返回一个不包含 password 字段的用户。

// Exclude keys from user
function exclude<User, Key extends keyof User>(
user: User,
keys: Key[]
): Omit<User, Key> {
return Object.fromEntries(
Object.entries(user).filter(([key]) => !keys.includes(key))
)
}

function main() {
const user = await prisma.user.findUnique({ where: 1 })
const userWithoutPassword = exclude(user, ['password'])
}

在 TypeScript 示例中,我们提供了两个泛型:UserKeyKey 泛型定义为 User 的键(例如 emailpasswordfirstName 等)。

这些泛型流经逻辑,返回一个省略提供的 Key 列表的 User