Prisma ORM是否有类似TypeORM的softDelete()软删除特性?
在Prisma中实现软删除(类似TypeORM的softDelete)
步骤1:更新Prisma Schema
先给需要软删除的模型添加deletedAt字段,类型设为可选DateTime,默认值为null:
model User { id Int @id @default(autoincrement()) name String email String @unique // 软删除标记字段 deletedAt DateTime? @db.DateTime(0) }
执行prisma migrate dev将字段同步到数据库。
步骤2:扩展Prisma客户端实现自动逻辑
利用Prisma的客户端扩展能力,添加softDelete方法,同时重写查询方法自动过滤已删除记录:
import { PrismaClient } from '@prisma/client' const prisma = new PrismaClient().$extends({ model: { $allModels: { // 自定义softDelete方法,仅更新deletedAt字段 async softDelete<T>( this: T, where: Parameters<T['delete']>[0]['where'] ): Promise<ReturnType<T['update']>> { const model = this as unknown as { update: (args: { where: typeof where; data: { deletedAt: Date } }) => Promise<any> } return model.update({ where, data: { deletedAt: new Date() }, }) }, // 重写findUnique,自动过滤已删除记录 async findUnique<T>( this: T, args: Parameters<T['findUnique']>[0] ): Promise<ReturnType<T['findUnique']>> { const model = this as unknown as { findUnique: (args: any) => Promise<any> } return model.findUnique({ ...args, where: { ...args.where, deletedAt: null, }, }) }, // 重写findMany,自动过滤已删除记录 async findMany<T>( this: T, args: Parameters<T['findMany']>[0] = {} ): Promise<ReturnType<T['findMany']>> { const model = this as unknown as { findMany: (args: any) => Promise<any> } return model.findMany({ ...args, where: { ...args.where, deletedAt: null, }, }) }, }, }, }) export default prisma
步骤3:使用方法
- 软删除记录:
// 仅更新deletedAt字段,保留数据库记录 await prisma.user.softDelete({ where: { id: 1 } })
- 查询记录:
调用findUnique或findMany时,会自动排除deletedAt不为null的记录:
// 仅返回未被软删除的用户 const user = await prisma.user.findUnique({ where: { id: 1 } }) const users = await prisma.user.findMany()
额外说明
- 若需查询已删除记录,可手动指定
where条件(如deletedAt: { not: null }),或使用原生查询方法。 - 可根据业务需求扩展更多方法(如
findFirst、update),确保自动过滤已删除数据。
内容的提问来源于stack exchange,提问作者Prashant Pandurang Kharade
相关产品推荐
相关产品推荐

