讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在Python的Flask中实现数据库记录的软删除防误删功能

夜辰小哥_5555

夜辰小哥_5555

发布时间:2026-09-30 10:32:07

|

243人浏览过

|

来源于php中文网

原创

软删除必须用 deleted_at 而非 is_deleted:前者保留删除时间以支持恢复、归档与审计,后者无法区分删除时效;需通过自定义 SoftDeleteQuery 实现全局过滤,并封装 soft_delete 方法更新时间戳,禁用 session.delete();Flask-Admin 和 API 应隐藏 deleted_at,改用 is_deleted 计算字段,并为 (deleted_at, id) 添加联合索引。

如何在python的flask中实现数据库记录的软删除防误删功能

软删除字段设计必须用 deleted_at 而不是布尔型 is_deleted

用布尔字段标记删除状态看似简单,但会丢失关键时间信息,导致无法做「7天内可恢复」或「按删除时间归档」等后续操作。更严重的是,is_deleted=True 无法区分「刚删」和「删了半年」,审计日志也无从追溯。

实际建表时,推荐统一使用 deleted_at(DateTime 类型,允许为 NULL):

created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
deleted_at = db.Column(db.DateTime, nullable=True)

这样所有未删除记录的 deleted_at 均为 None,查询时只需判断是否为 None 即可。

全局查询拦截必须重写 query_class,不能只靠手动加 .filter(deleted_at.is_(None))

手动在每个 Model.query.filter(...) 后补条件极易遗漏,尤其在关联查询、子查询或第三方扩展(如 Flask-Admin)中几乎不可控。

立即学习“Python免费学习笔记(深入)”;

正确做法是自定义一个带软删除逻辑的查询类,并绑定到基类模型:

class SoftDeleteQuery(BaseQuery):
    def __new__(cls, *args, **kwargs):
        obj = super().__new__(cls)
        # 只对继承了 SoftDeleteMixin 的模型启用过滤
        if hasattr(obj._mapper_zero(), 'deleted_at'):
            obj = obj.filter_by(deleted_at=None)
        return obj

然后让所有模型继承该查询类:

class BaseModel(db.Model):
    __abstract__ = True
    query_class = SoftDeleteQuery
    # ... 公共字段定义

注意:如果某次真需要查已删除数据(比如后台回收站),可用 Model.with_deleted().filter(...),这需要额外在 SoftDeleteMixin 中实现 with_deleted() 类方法。

Python Use Agent
Python Use Agent

智能执行Python任务,自动生成、执行代码并反馈结果,无需额外配置,兼容旧命令。

下载

delete() 方法必须走事务 + 时间戳更新,禁止用 session.delete()

直接调用 session.delete(instance) 会触发物理删除,彻底丢失数据 —— 这正是要防止的误删根源。

应在模型中封装安全删除逻辑:

  • 定义 soft_delete(self) 实例方法,仅更新 deleted_at
  • 确保该方法内部调用 db.session.commit() 或由上层统一提交
  • 若需级联软删除(如删除用户时软删其订单),必须显式遍历并调用各子对象的 soft_delete(),不能依赖 cascade="all"(它会物理删除)

示例:

def soft_delete(self):
    self.deleted_at = datetime.utcnow()
    db.session.add(self)  # 确保被追踪
    # 不在此处 commit,交由业务层统一控制事务

调用时:user.soft_delete(); db.session.commit()。

Flask-Admin 和 API 序列化必须显式处理 deleted_at 字段

Flask-Admin 默认展示所有字段,包括 deleted_at,暴露删除时间可能引发隐私或合规问题;API 返回 JSON 时若未过滤该字段,前端可能误判状态(比如把 "deleted_at": null 当作普通字段渲染)。

解决方式分两层:

  • Flask-Admin:在 ModelView 中设置 column_exclude_list = ['deleted_at'],并重写 get_query() 和 get_count_query() 以跳过软删记录(除非专门做「回收站」视图)
  • 序列化(如用 Marshmallow):在 Schema 中排除 deleted_at,或添加 load_only/dump_only 控制方向;若需表达「是否已删」,应额外定义计算字段 is_deleted,值为 True 当且仅当 deleted_at is not None

别忽略数据库索引 —— 对高频查询的软删表,建议给 (deleted_at, id) 加联合索引,避免全表扫描。

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1631

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

3944

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1629

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

22677

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2787

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2827

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1123

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn