首页 / Prisma ORM 入门教程 / 读取数据:find 家族与 orThrow

Prisma ORM 入门教程

读取数据:find 家族与 orThrow

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

findUniquefindFirstfindManycountP2025空结果CRUD

本节目标:分清 findUnique / findFirst / findMany / count 的适用场景,学会处理查不到数据的情况。

读取是日常最频繁的操作。Prisma 提供四个 find 方法加一个 count,各有各的脾气。先记住一句话:能唯一确定的用 findUnique,取「第一条」用 findFirst,取「列表」用 findMany,数个数用 count。

选方法的判断流程:

  1. 结果最多一条,且用唯一字段定位 → findUnique
  2. 结果最多一条,但没有唯一字段可用 → findFirst
  3. 结果可能很多条 → findMany
  4. 只想知道有多少条 → count
  5. 确定「必须有」,没有就是异常 → 对应方法的 OrThrow 变体

findUnique:按唯一字段查单条

const user = await prisma.user.findUnique({
  where: { email: "elsa@prisma.io" },
});

where 必须传唯一字段:主键 id、@unique 字段或复合唯一键。传非唯一字段会直接报错,这是刻意的约束,保证结果最多一条。查不到时返回 null,不抛异常。

复合唯一键的写法是字段名用下划线拼起来:

// @@unique([firstName, lastName]) 定义在模型上
const user = await prisma.user.findUnique({
  where: { firstName_lastName: { firstName: "Ada", lastName: "Lovelace" } },
});

findUniqueOrThrow:查不到就报错

业务上「必须存在」的场景,比如按 id 取详情,用 OrThrow 变体:

const user = await prisma.user.findUniqueOrThrow({
  where: { id: 42 },
});

查不到时抛 P2025(记录不存在)错误。省掉一个判空分支,错误码也方便上层统一处理成 404 响应。P2025 的完整错误处理体系在第 42 章展开。

Tip

先判断「该不该存在」。该存在 → 用 OrThrow 变体;可能不存在 → 用普通方法加判空。

findFirst / findFirstOrThrow:取第一条匹配

const post = await prisma.post.findFirst({
  where: { published: true },
  orderBy: { createdAt: "desc" },
});

where 没有唯一性要求,只取匹配的第一条。不传 orderBy 时,顺序由数据库决定,结果不确定;想取「最新一条」必须显式排序。它比 findUnique 灵活:按非唯一字段取一条、取「评分最高的用户」这类需求都靠它。查不到返回 null,OrThrow 变体抛 P2025。

findMany:查列表

const posts = await prisma.post.findMany({
  where: { published: true },
  orderBy: { createdAt: "desc" },
  take: 10,
});

返回数组,一条都没有时是空数组 [],不是 null。take 限制条数,orderBy 控制排序,skip 可以跳过前 N 条——这俩组合就是第 23 章分页的基础。where 的完整操作符(contains、gt、OR 等)在第 22 章展开。

count:只数个数

const total = await prisma.post.count({
  where: { published: true },
});

返回数字。分页场景先 count 拿总数,再 findMany 取当页数据,两件事分开做。count 接受和 findMany 一样的 where,过滤条件可以直接复用。

空结果处理速查

方法查不到时
findUniquenull
findUniqueOrThrow抛 P2025
findFirstnull
findFirstOrThrow抛 P2025
findMany[]
count0

null 表示「可能有一条但没找到」,[] 表示「本来就可能有很多条」。写代码时先想清楚返回值是对象还是数组,再决定怎么判空。对象要判 if (!user),数组直接判断 length === 0,两者写法不一样,混用会出隐蔽 bug。

参考来源

  • Prisma 官方文档:CRUD(Read)
  • Generalist Programmer:Prisma ORM Tutorial(Read Operations)
  • Generalist Programmer:Prisma ORM Cheat Sheet(CRUD Operations)