排除字段
默认情况下,Prisma Client 返回模型中的所有字段。您可以使用 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
}
const prisma = new PrismaClient({
omit: {
user: {
password: true
}
}
})
// The password field is excluded in all queries, including this one
const user = await prisma.user.findUnique({ where: { id: 1 } })
使用 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
}
const prisma = new PrismaClient()
// The password field is excluded only in this query
const user = await prisma.user.findUnique({
omit: {
password: true
},
where: {
id: 1
}
})
如何省略多个字段
省略多个字段的工作方式与选择多个字段相同:向省略选项添加多个键值对。使用与之前相同的模式,您可以使用以下方法省略密码和电子邮件
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
来“覆盖”它。
- 显式选择
- 省略 False
const user = await prisma.user.findUnique({
select: {
firstName: true,
lastName: true,
password: true // The password field is now selected.
},
where: {
id: 1
}
})
const user = await prisma.user.findUnique({
omit: {
password: false // The password field is now selected.
},
where: {
id: 1
}
})
何时在全局或本地使用 omit
了解何时在全局或本地省略字段非常重要
- 如果您要省略某个字段以防止它意外包含在查询中,最好在全局范围内省略它。例如:全局省略 User 模型中的密码字段,以防止敏感信息意外泄露。
- 如果您要省略某个字段是因为它在查询中不需要,最好在本地省略它。
本地省略(在查询中提供 omit
选项时)仅适用于定义它的查询,而全局省略适用于使用相同 Prisma Client 实例执行的每个查询,除非使用了特定的选择或覆盖了省略。
在不使用 omit
的情况下排除密码字段
注意
在 Prisma ORM 5.13.0 中发布的 omitApi
预览功能是从查询结果中省略字段的首选方法。在 Prisma ORM 5.16.0 中,全局省略字段的功能已添加到 omitApi
预览功能中。此文档对于 Prisma ORM 5.13.0 之前的版本仍然适用。
以下是一个类型安全的 exclude
函数,它返回没有 password
字段的用户。
- TypeScript
- JavaScript
// 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'])
}
// Exclude keys from user
function exclude(user, keys) {
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 示例中,我们提供了两个泛型:User
和 Key
。Key
泛型定义为 User
的键(例如 email
、password
、firstName
等)。
这些泛型贯穿整个逻辑,返回一个省略提供的 Key
列表的 User
。