You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:37:12