【问题标题】:How to update document with specific version如何使用特定版本更新文档
【发布时间】:2022-11-19 05:25:54
【问题描述】:

我有一个用例,我的函数首先获取用户记录,对其进行一些处理,然后对其进行更新。为保证正确操作,我需要确保在完成此类工作时未更新用户记录。通常,我会通过向我的用户模型添加版本来做到这一点,因此我得到当前版本并根据这个确切版本进行更新(每次更新时自动递增),但是我收到一个奇怪的唯一性错误,我无法理解出去:

用户模型

model User {
  uid       String   @id @default(uuid())
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  version   Int      @default(0)
  email     String   @unique
}

更新操作

prisma.user.update({
  where: { uid, version },
  data: { ...newData, version: { increment: 1 } }
})

版本突出显示并出现以下错误

输入 '{ uid: string;版本:编号; }' 不可分配给类型 'UserWhereUniqueInput'。对象字面量只能指定已知 属性,并且“版本”在类型中不存在 'UserWhereUniqueInput'.ts(2322)

【问题讨论】:

    标签: prisma


    【解决方案1】:

    这是因为您需要一个 unique 子句才能在简单更新中使用 where 子句。 Prisma 要求您为此类更新提供唯一约束,例如 findUnique 中的 where 子句。当前,您的唯一约束在 email 字段上

    在这里你有2个解决方案

    好的做法?

    uidversion 之间添加唯一约束

    model User {
      uid       String   @id @default(uuid())
      createdAt DateTime @default(now())
      updatedAt DateTime @updatedAt
      version   Int      @default(0)
      email     String   @unique
    
      // new unique constraint
      @@unique([uid, version])
    }
    

    然后您可以使用新的唯一约束进行更新

    prisma.user.update({
      where: { uid_version: { uid, version } },
      data: { ...newData, version: { increment: 1 } }
    })
    

    轻松获胜

    如果你愿意,你也可以做一个不需要唯一约束来过滤的updateMany

    prisma.user.updateMany({
      where: { uid, version },
      data: { ...newData, version: { increment: 1 } }
    })
    

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2019-02-21
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多