0

0

sqlalchemy 如何实现“软删除”字段并自动过滤查询

舞姬之光

舞姬之光

发布时间:2026-01-26 19:41:02

|

693人浏览过

|

来源于php中文网

原创

软删除应使用 deleted_at 字段而非 is_deleted。建 datetime 类型可空字段,删除时设为当前时间,查询默认过滤 deleted_at IS NULL,需封装安全查询与 soft_delete 方法,并注意索引、恢复冲突及跨服务一致性。

sqlalchemy 如何实现“软删除”字段并自动过滤查询

软删除字段怎么建:用 deleted_atis_deleted 更可靠

直接在模型里加一个可为空的 deleted_at 字段,类型为 DateTime(或数据库对应的时序类型),默认值为 None。不推荐用布尔字段 is_deleted,因为无法记录删除时间、难以做恢复审计、且在多条件过滤时容易漏掉 IS NULL 判断。

  • deleted_at = Column(DateTime, nullable=True)
  • 删除时不删行,而是设为 datetime.utcnow()
  • 查询时默认只取 deleted_at IS NULL 的记录

如何自动过滤查询:用 default_filter + Query 子类(SQLAlchemy 1.x)或 apply_criteria(2.x)

SQLAlchemy 1.x 可通过自定义 Query 类,在 iterall() 前自动加过滤;SQLAlchemy 2.x 推荐用 select() + where() 组合,配合 apply_criteria 或封装查询函数。

  • 1.x 方案:继承 Query,重写 iter,对所有模型检查是否存在 deleted_at 字段,有则追加 deletedat.is(None)
  • 2.x 更自然:把“非删除”逻辑下沉到查询构造层,比如封装 safe_select(Model) 函数,内部自动 .where(Model.deletedat.is(None))
  • 注意:手动写的 select().where(...) 不会自动触发过滤,必须显式调用封装逻辑

删除操作别手写 session.delete():用自定义方法统一处理

session.delete(obj) 是真删,不能用于软删除。必须提供模型级方法,比如 obj.soft_delete(),它只更新 deleted_at 并提交。

微信 WeLM
微信 WeLM

WeLM不是一个直接的对话机器人,而是一个补全用户输入信息的生成模型。

下载
  • 在模型中定义方法:def soft_delete(self): self.deleted_at = datetime.utcnow()
  • 配合 session.flush()session.commit() 生效
  • 如果用了 event.listen(mapper, 'before_update'),注意判断是否真的在删(比如检查 deleted_atNone 变成非空),否则可能误触发
  • 多表关联删除时,外键行不会自动软删,得手动遍历或用 cascade + 自定义事件处理

硬删、恢复、索引这些事容易被忽略

软删除不是万能的,几个实际踩坑点:

  • 真要物理删除时,得显式 .filter(Model.deleted_at.isnot(None)).delete(synchronize_session=False),否则会被默认过滤拦住
  • 恢复操作就是 obj.deleted_at = None,但要注意唯一约束冲突(比如邮箱已被“删掉”的用户占着)
  • deleted_at 字段务必加索引,否则带 WHERE deleted_at IS NULL 的大表查询会全表扫
  • 使用 bulk_insert_mappingsexecute(insert().values(...)) 时,不会触发模型方法或事件,deleted_at 默认是 None,但得确认业务是否允许批量插入即“已删除”状态

真正麻烦的是跨服务或异步任务里忘了查 deleted_at —— 一次漏判,数据就错位了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

235

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

315

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

748

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

88

2025.08.19

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

274

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.12.29

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

356

2023.06.29

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

28

2026.01.26

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 51.4万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号