精通 Prisma 与 SQL 关系
如果你了解 Prisma 如何处理连接,它会让数据库工作变得非常简单。这是一份关于 Schema、关系和查询的指南。
Schema 与关系
关系定义了数据如何相互连接。
- 一对多:一个用户拥有多篇文章。
Post模型持有外键 (authorId),而User模型仅持有引用。 - 多对多:一个用户属于多个项目,一个项目也有多个用户。你需要一个中间表 (
ProjectMember) 来连接两者。该表持有双方的外键。 - 自关联:一个用户关注另一个用户。你需要使用命名的关系(如 "Follower" 和 "Following"),以便 Prisma 区分哪一侧是哪一侧。
核心查询方法
- findUnique:用于具有 @id 或 @unique 字段的记录。如果未找到记录,则返回 null。
- findMany:用于获取列表。你可以进行过滤、排序和分页。
- findFirst:当你需要一条记录但过滤条件不是唯一字段时使用。
使用 where 进行过滤
"where" 子句直接映射到 SQL。
- 比较:使用 gt(大于)、lt(小于)或 gte(大于或等于)。
- 文本搜索:使用 "contains" 配合 "mode: insensitive" 进行不区分大小写的搜索。
- 逻辑运算符:使用 OR、AND 或 NOT 来组合条件。
- 关系过滤器:使用 "some"、"every" 或 "none" 根据关联数据进行过滤。"some" 会查找至少有一个关联匹配的记录。
数据控制:select vs include
- select:精确选择要返回的字段。这能保持数据轻量且安全。
- include:将相关数据联接到结果中。这会引入嵌套对象。
- 注意:你不能在同一层级同时使用 select 和 include。你必须二选一。但是,你可以在 include 内部使用 select 来从联接的关系中选择特定字段。
操作与安全
- createMany:一次性创建多行数据。它速度很快,但不支持嵌套写入。
- upsert:如果记录存在则更新,如果不存在则创建。这非常适合购物车场景。
- update:使用 increment 或 decrement 等原子操作来更改数值,从而避免错误。
- $transaction:将多个写入操作组合在一起。如果其中一部分失败,整个组都会回滚。这可以防止部分数据错误。
分页
通过结合 "take" 和 "skip" 来构建分页。
- take:要显示的记录数。
- skip:要跳过的记录数。
来源:https://dev.to/chinwuba_jeffrey/understanding-prisma-and-sql-relationships-schema-and-querying-l7k