所以我一直在使用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
1条答案
按热度按时间q5iwbnjs1#
Prisma更新底层引擎中的@updatedAt字段。
Channel
模型与Users
表上的外键之间存在一对多关系(我假设您有一个channelId
字段),或者隐式多对多关系,其中prisma管理关系表本身。在这两种情况下,prisma都没有写入
channels
表,因此不会更新channels
上的'updatedAt'字段。它要么更新users
表上的channelId
外键,要么更新prisma创建的内部_ChannelsToUsers
表。一个建议的解决方法是告诉prisma在查询过程中更新
updatedAt
。(注意,如果您有多对多关系,这不会更新users
表。)字符串
如果你有一个多对多,你将需要在查询中更新用户,如果prisma正确处理它,通过将
update: { where: { id: userId }, data: { updatedAt: new Date() }}
添加到查询args的user
部分,或者第二次写入,可能作为事务的一部分。