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

Posted

技术标签:

【中文标题】如何使用 Prisma 为 Postgres 进行 SQL 插入,条件是行数?【英文标题】:How to do SQL insert for Postgres using Prisma with condition on count of rows? 【发布时间】:2021-08-29 18:25:15 【问题描述】:

我正在尝试在数据库中插入一行,前提是 - 表中已经满足某些条件的行数小于某个阈值,例如 10。例如,在下面的模型中,我不想有一个项目拥有10个以上的用户;所以count(projectId)应该小于10:

model User 
  id            BigInt      @id @default(autoincrement())

  firstName     String      @map("first_name")
  lastName      String      @map("last_name")
  email         String      @unique

  password      String
  passwordHash  String      @map("password_hash")

  createdAt     DateTime    @db.Timestamptz() @default(now()) @map("created_at")
  updatedAt     DateTime    @db.Timestamptz() @updatedAt @map("updated_at")

  project       Project     @relation(fields: [projectId], references: [id])
  projectId     BigInt?     @map("project_id")

  @@map("app_user")


model Project 
  id            BigInt    @id @default(autoincrement())
  name          String

  users         User[]

  @@map("project")

在一般的 SQL 世界中,我会依赖具有 乐观并发控制 的事务,然后仅在读取匹配 project_id 的行数后尝试插入。由于 Prisma 不提供传统的长时间运行的事务,我被卡住了。我不能只是简单地先运行计数查询然后再进行插入,因为它本质上不是原子的。

如何使用 Prisma 处理这种情况?

【问题讨论】:

【参考方案1】:

您可以通过两种方式做到这一点:

    在您的模型中添加一个version 字段并在您的应用程序逻辑中执行乐观并发控制,如here 所示。

    使用 Prisma 的 raw query 机制运行原生事务。

【讨论】:

以上是关于如何使用 Prisma 为 Postgres 进行 SQL 插入,条件是行数?的主要内容,如果未能解决你的问题,请参考以下文章

使用 prisma 在 Navicat 上插入 Postgres 数据库

如何在 prisma 中使用带有外键的 createMany?

Docker 中的 NestJS 无法在另一个 Docker 容器中的 Postgres 上执行 Prisma Migrate

Prisma 和 Postgres FetchError:对 http://localhost:4466/management 的请求失败

Prisma 无法验证数据库服务器

Prisma:跨数据库中的多个模式进行查询