精通 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