Prisma是一个现代的数据库访问库,它本身不直接提供软删除(soft delete)和硬删除(hard delete)这样的内建机制,但你可以在应用层面实现这两种删除策略。

  • 硬删除:直接从数据库中删除记录,这是数据库最基本的删除操作。在Prisma中,你可以使用deletedeleteMany方法来执行硬删除。
  • 软删除:软删除通常是通过在数据库记录中设置一个标记(如deletedAt时间戳字段)来实现的,而不是实际从数据库中移除记录。这样做的好处是,你可以保留数据,以便将来需要恢复或保留删除记录的历史。

为了在Prisma中实现软删除,你可以按照以下步骤操作:

  1. 在你的模型中添加一个如deletedAt的字段,通常是一个可选的日期时间字段。

    model User {
      id        Int      @id @default(autoincrement())
      name      String
      deletedAt DateTime? // 可选的软删除标记
      // 其他字段...
    }
  2. 当你想要软删除一个记录时,只需要更新deletedAt字段为当前时间戳。

    const user = await prisma.user.update({
      where: { id: userId },
      data: { deletedAt: new Date() },
    });
  3. 为了获取未被软删除的记录,你可以在查询时过滤掉那些deletedAt字段非空的记录。

    const users = await prisma.user.findMany({
      where: { deletedAt: null },
    });
  4. 如果你需要恢复一个被软删除的记录,你可以将deletedAt字段更新回null

    const user = await prisma.user.update({
      where: { id: userId },
      data: { deletedAt: null },
    });

通过这种方式,你可以在应用层面模拟软删除的行为。需要注意的是,你可能需要在大多数的查询中都包含deletedAt: null的条件,除非你需要特意查询到已经软删除的记录。

  1. 如果你需要获取被软删除的数据,可以添加一个选择deletedAt字段不为null的条件:
const deletedUsers = await prisma.user.findMany({
  where: { deletedAt: { not: null } },
});

这个查询将返回所有deletedAt字段有值的记录,即软删除的用户。通过这种方式,你可以轻松地访问到已经软删除的数据。

分类: Nest.js 标签: prismaNestjs软删除硬删除

评论

全部评论 1

  1. terg
    terg
    Google Chrome Windows 10
    [嗑瓜子]

目录