如何使用 Prisma 编写相当于 SQL MERGE 语句?

How to write equivalent of SQL MERGE statement using Prisma?

我有一个 GraphQL 突变接受 post 的标签列表。 PostTag 模型是:

model PostTag {
  id        BigInt          @id @default(autoincrement())

  order     Int
  value     String

  post      Post            @relation(fields: [postId], references: [id])
  postId    BigInt          @map("post_id")
  

  @@map("post_tag")
}

我的 REST API 是 PUT /posts/{postId}/tags,它接收要根据给定 Post 更新的标签列表。在此列表中,一些标签可能有 id,这意味着它是一个现有的 tag 项目,应该更新。会有tag条没有id的意思,应该是新加的。针对给定 post 的缺失标签意味着应删除这些标签。

我可以使用 SQL 合并语句来做到这一点。我想使用 Prisma 获得类似的结果。如何使用 Prisma?

高效地做到这一点

在撰写本文时,没有与 merge 语句等效的语句。使用两个查询的解决方法如下:

  1. 删除现有的 PostTag 记录连接到特定 PostdeleteMany
  2. 使用 createMany 从 API 端点接收的数据创建新的 PostTag 记录。

最好,您可以将查询 1 和查询 2 包装在 transaction 中,以确保数据库不会处于不一致状态。

这不如 merge 命令优化。如果您特别需要灵活性和性能,请考虑在提及您的用例的 prisma 存储库中创建 feature request

您还可以使用 prisma.$exectureRaw

将 MERGE 查询编写为普通 SQL