postgresql Prisma @updatedAt在更新时不会更改

gywdnpxw  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(152)

所以我一直在使用postgresql和prisma处理NestJS后端,在测试过程中我注意到,当我使用prisma的.update()函数更新一条记录时,它实际上并没有更新updatedAt字段;这是我的一个prisma模型的例子:

model Channel {
    id           String    @id @default(uuid())
    name         String?
    description  String?
    type         String    @default("DIRECT")
    password     String?
    firstOwnerId String?
    ownerId      String?
    adminIds     String[]  @default([])
    mutes        Mute[]
    kicks        Kick[]
    users        User[]
    messages     Message[]

    createdAt DateTime @default(now())
    updatedAt DateTime @updatedAt

    @@map("channels")
}

字符串
这就是我如何更新函数:

await this.prismaService.channel.update({
        where: {
          id: channelId,
        },
        data: {
          users: {
            connect: {
              id: userId,
            },
          },
        },
        include: channelIncludes,
      });


我正在使用最新版本的Prisma和NestJS "@prisma/client": "^5.1.1""@nestjs/common": "^10.2.2"
我看了一下Prisma生成的SQL迁移,我注意到updatedAt并没有真正的东西可以在更改时更新它;

CREATE TABLE "channels" (
    "id" TEXT NOT NULL,
    "name" TEXT,
    "description" TEXT,
    "type" TEXT NOT NULL DEFAULT 'DIRECT',
    "password" TEXT,
    "firstOwnerId" TEXT,
    "ownerId" TEXT,
    "adminIds" TEXT[] DEFAULT ARRAY[]::TEXT[],
    "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
    "updatedAt" TIMESTAMP(3) NOT NULL,

    CONSTRAINT "channels_pkey" PRIMARY KEY ("id")
);


我相信它应该有这样的东西; DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

q5iwbnjs

q5iwbnjs1#

Prisma更新底层引擎中的@updatedAt字段。Channel模型与Users表上的外键之间存在一对多关系(我假设您有一个channelId字段),或者隐式多对多关系,其中prisma管理关系表本身。
在这两种情况下,prisma都没有写入channels表,因此不会更新channels上的'updatedAt'字段。它要么更新users表上的channelId外键,要么更新prisma创建的内部_ChannelsToUsers表。
一个建议的解决方法是告诉prisma在查询过程中更新updatedAt。(注意,如果您有多对多关系,这不会更新users表。)

await this.prismaService.channel.update({
        where: {
          id: channelId,
        },
        data: {
>>>       updatedAt: new Date(),
          users: {
            connect: {
              id: userId,
            },
          },
        },
        include: channelIncludes,
      });

字符串
如果你有一个多对多,你将需要在查询中更新用户,如果prisma正确处理它,通过将update: { where: { id: userId }, data: { updatedAt: new Date() }}添加到查询args的user部分,或者第二次写入,可能作为事务的一部分。

相关问题