Перейти к содержимому

15. Soft Delete

Мягкое удаление (soft delete) — это паттерн, при котором записи не удаляются физически из базы данных, а лишь помечаются как удалённые с помощью специального поля deletedAt. Это позволяет восстанавливать данные и сохранять историю изменений.

model User {
id Int @id @default(autoincrement())
email String @unique
name String
deletedAt DateTime? // null = активен, дата = удалён
createdAt DateTime @default(now())
}
prisma.$use(async (params, next) => {
if (params.model === 'User') {
// Перехватить delete → soft delete
if (params.action === 'delete') {
params.action = 'update'
params.args['data'] = { deletedAt: new Date() }
}
if (params.action === 'deleteMany') {
params.action = 'updateMany'
if (params.args.data !== undefined) {
params.args.data.deletedAt = new Date()
} else {
params.args['data'] = { deletedAt: new Date() }
}
}
// Автоматически фильтровать удалённые
if (['findFirst', 'findMany', 'findUnique'].includes(params.action)) {
params.args.where = {
...params.args?.where,
deletedAt: null,
}
}
}
return next(params)
})
// Восстановить удалённую запись
const restored = await prisma.user.update({
where: { id: userId },
data: { deletedAt: null },
})

Для доступа к удалённым записям нужно использовать $queryRaw или временно отключить middleware:

// Все записи включая удалённые
const allUsers = await prisma.$queryRaw`
SELECT * FROM "users" WHERE "deletedAt" IS NOT NULL
`