如何使用 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
语句等效的语句。使用两个查询的解决方法如下:
- 删除现有的
PostTag
记录连接到特定 Post
与 deleteMany
。
- 使用
createMany
从 API 端点接收的数据创建新的 PostTag
记录。
最好,您可以将查询 1 和查询 2 包装在 transaction 中,以确保数据库不会处于不一致状态。
这不如 merge
命令优化。如果您特别需要灵活性和性能,请考虑在提及您的用例的 prisma 存储库中创建 feature request。
您还可以使用 prisma.$exectureRaw
将 MERGE 查询编写为普通 SQL
我有一个 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
语句等效的语句。使用两个查询的解决方法如下:
- 删除现有的
PostTag
记录连接到特定Post
与deleteMany
。 - 使用
createMany
从 API 端点接收的数据创建新的PostTag
记录。
最好,您可以将查询 1 和查询 2 包装在 transaction 中,以确保数据库不会处于不一致状态。
这不如 merge
命令优化。如果您特别需要灵活性和性能,请考虑在提及您的用例的 prisma 存储库中创建 feature request。
您还可以使用 prisma.$exectureRaw
将 MERGE 查询编写为普通 SQL