首页 / Prisma ORM 入门教程 / 字段裁剪:select、include 与 omit

Prisma ORM 入门教程

字段裁剪:select、include 与 omit

本教程共 54 篇 · 第 21 篇 · 更新于 2026-08-11 · 约 3 分钟阅读

selectincludeomit字段裁剪_count关系查询类型安全

本节目标:学会控制查询返回的字段和关系,让结果更小、更清晰、更安全。

Prisma 默认返回模型的所有标量字段,不带任何关系。全字段返回写起来省事,但接口给前端的数据常常一大半用不上,还容易把 password 这类敏感字段带出去。三个选项可以调整返回形状:select 白名单裁剪、include 追加关系、omit 黑名单剔除。

select:只拿需要的字段

const user = await prisma.user.findFirst({
  select: { email: true, name: true },
});
// { email: "...", name: "..." }

select 是白名单:列出的字段才返回。返回类型也会跟着收窄,漏掉的字段在 TypeScript 里直接访问不到,编译期就报错。不止 find,create、update 等几乎所有查询都能用 select。

include:追加关系与嵌套裁剪

const user = await prisma.user.findFirst({
  include: { posts: true },
});

include 保留全部标量字段,再附加指定关系。posts: true 表示带出完整帖子,也可以给关系加条件:

include: {
  posts: {
    where: { published: true },
    orderBy: { createdAt: "desc" },
    take: 5,
  },
},
Note

select 和 include 在同一层不能同时出现。想裁剪又想带关系,把其中一个嵌套进另一层即可。

嵌套裁剪顺着同一思路:每一层都可以独立决定要哪些字段,关系可以继续往下嵌套。select 里套 select:

const user = await prisma.user.findFirst({
  select: {
    email: true,
    posts: {
      select: { title: true, published: true },
    },
  },
});

每一层都可以独立决定要哪些字段,关系可以继续往下嵌套。反过来的组合也成立:include 关系,再在关系里用 select 裁剪子字段:

const user = await prisma.user.findFirst({
  include: {
    posts: {
      select: { title: true, published: true },
    },
  },
});

接口返回什么、页面渲染用什么,就用这套组合精确对齐,避免把整张表的字段都拖回前端。

omit:排除敏感字段

只想删掉一两个字段,用 omit 更省事:

const user = await prisma.user.findUnique({
  where: { id: 1 },
  omit: { password: true },
});

还可以客户端级全局配置,所有查询自动排除:

const prisma = new PrismaClient({
  adapter,
  omit: {
    user: { password: true },
  },
});

选择建议:只要少数几个字段用 select;默认结果大体合适、只想剔除少数字段(尤其是密码这类敏感信息)用 omit。全局 omit 适合「这个字段任何查询都不该返回」的场景,比如统一挡住密码、内部备注。注意 omit 只能作用于标量字段,关系字段要用 include/select 控制。

_count:统计关系数量

不带出关系详情,只想知道数量:

const users = await prisma.user.findMany({
  select: {
    id: true,
    _count: { select: { posts: true } },
  },
});
// { id: 1, _count: { posts: 3 } }

_count 还能加过滤条件,比如只数已发布的帖子:

_count: {
  select: {
    posts: { where: { published: true } },
  },
},

列表页「每个用户有几篇文章」这类需求,一个 _count 就够,不用把帖子全查出来再数。

为什么要裁剪

三个理由:传输的数据更少,接口响应更快;返回类型更精确,前端不可能访问到不该看的字段;敏感字段不会无意中漏出去。默认全字段返回只适合开发初期,接口稳定后建议把 select 补上。

参考来源

  • Prisma 官方文档:Select fields
  • Prisma 官方文档:Excluding fields
  • Mapagam:Selecting and Including Data