如何使用 Prisma 编写等效的 SQL MERGE 语句?

Posted

技术标签:

【中文标题】如何使用 Prisma 编写等效的 SQL MERGE 语句?【英文标题】:How to write equivalent of SQL MERGE statement using Prisma? 【发布时间】:2021-12-15 03:40:28 【问题描述】:

我有一个接受帖子标签列表的 GraphQL 突变。 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 的意思,应该是新添加的。给定帖子缺少标签意味着应该删除这些标签。

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

【问题讨论】:

【参考方案1】:

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

    删除现有的PostTag 记录,该记录使用deleteMany 连接到特定的Post。 根据从带有createMany 的API 端点接收的数据创建新的PostTag 记录。

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

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

【讨论】:

以上是关于如何使用 Prisma 编写等效的 SQL MERGE 语句?的主要内容,如果未能解决你的问题,请参考以下文章