如何使用 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 语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 oracle 数据库中为具有复杂聚合的数据透视编写等效的 sql 查询?

NestJS-Prisma,如何编写与 prisma 一对多类型匹配的 DTO

如何使用 Prisma 为 Postgres 进行 SQL 插入,条件是行数?

在 WHERE 子句中使用函数编写 SQL SELECT 语句是不是有 Django 等效项?

连接字符串出错,如何将 Prisma 连接到 Azure SQL 数据库

使用 GraphQL、Nexus 和 Prisma 优化 SQL 查询