上一篇
Python标记删除实现教程 - 详解软删除技术 | Python数据管理指南
- Python
- 2025-08-10
- 609
Python标记删除实现教程 - 详解软删除技术
本教程将详细介绍Python中实现标记删除(软删除)的技术方法,包含核心概念、实现步骤和完整代码示例。
什么是标记删除?
标记删除(软删除)是一种数据管理技术,它不会真正从数据库中删除记录,而是通过设置一个特殊标记字段(如is_deleted
)来标记记录为"已删除"状态。这种技术相比物理删除具有多项优势:
- 数据恢复简单 - 只需修改标记状态
- 保留历史记录 - 满足审计需求
- 避免级联删除问题
- 提高数据安全性
标记删除 vs 物理删除
对比项 | 标记删除 | 物理删除 |
---|---|---|
数据恢复 | 容易 | 困难 |
性能影响 | 低 | 高(特别是大表) |
数据完整性 | 保留历史数据 | 永久丢失 |
Python实现标记删除的步骤
1. 数据库设计
在数据库表中添加标记字段:
CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL, is_deleted BOOLEAN DEFAULT FALSE, -- 标记删除字段 deleted_at TIMESTAMP NULL -- 可选:记录删除时间 );
2. Python实现标记删除
import sqlite3 from datetime import datetime class UserManager: def __init__(self, db_path): self.conn = sqlite3.connect(db_path) self.cursor = self.conn.cursor() self._create_table() def _create_table(self): """创建用户表""" self.cursor.execute(''' CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT NOT NULL, is_deleted BOOLEAN DEFAULT 0, deleted_at TIMESTAMP ) ''') self.conn.commit() def add_user(self, name, email): """添加新用户""" self.cursor.execute(''' INSERT INTO users (name, email) VALUES (?, ?) ''', (name, email)) self.conn.commit() return self.cursor.lastrowid def mark_delete(self, user_id): """标记删除用户""" self.cursor.execute(''' UPDATE users SET is_deleted = 1, deleted_at = ? WHERE id = ? ''', (datetime.now(), user_id)) self.conn.commit() def recover_user(self, user_id): """恢复已删除的用户""" self.cursor.execute(''' UPDATE users SET is_deleted = 0, deleted_at = NULL WHERE id = ? ''', (user_id,)) self.conn.commit() def get_active_users(self): """获取所有未删除的用户""" self.cursor.execute(''' SELECT id, name, email FROM users WHERE is_deleted = 0 ''') return self.cursor.fetchall() def get_deleted_users(self): """获取所有已删除的用户""" self.cursor.execute(''' SELECT id, name, email, deleted_at FROM users WHERE is_deleted = 1 ''') return self.cursor.fetchall() def close(self): """关闭数据库连接""" self.conn.close() # 使用示例 if __name__ == "__main__": manager = UserManager("users.db") # 添加用户 manager.add_user("张三", "zhangsan@example.com") manager.add_user("李四", "lisi@example.com") # 标记删除用户 manager.mark_delete(1) # 获取活跃用户 active_users = manager.get_active_users() print("活跃用户:", active_users) # 获取已删除用户 deleted_users = manager.get_deleted_users() print("已删除用户:", deleted_users) # 恢复用户 manager.recover_user(1) manager.close()
3. 查询时过滤已删除数据
在所有查询中添加过滤条件,排除已标记删除的记录:
# 获取单个用户(排除已删除) def get_user(self, user_id): self.cursor.execute(''' SELECT id, name, email FROM users WHERE id = ? AND is_deleted = 0 ''', (user_id,)) return self.cursor.fetchone() # 统计活跃用户数量 def count_active_users(self): self.cursor.execute(''' SELECT COUNT(*) FROM users WHERE is_deleted = 0 ''') return self.cursor.fetchone()[0]
最佳实践建议
- 使用标准化字段名 - 在整个项目中统一使用如
is_deleted
的字段名 - 添加删除时间戳 - 记录删除时间有助于审计和数据分析
- 实现自动过滤 - 在ORM或数据访问层自动添加过滤条件
- 定期归档数据 - 对长期标记删除的数据进行归档处理
- 权限管理 - 限制查看已删除数据的权限
- 性能优化 - 为标记字段添加索引,特别是大型数据表
在ORM框架中的实现
在SQLAlchemy等ORM框架中,可以通过混合属性和事件监听实现自动过滤:
from sqlalchemy import Column, Integer, String, Boolean, DateTime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import event from sqlalchemy.orm import Session, Query Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(100), nullable=False) email = Column(String(100), nullable=False) is_deleted = Column(Boolean, default=False) deleted_at = Column(DateTime) @classmethod def active_users(cls): """查询作用域:仅返回未删除的用户""" return Query(cls).filter_by(is_deleted=False) # 添加事件监听器,在查询前自动添加过滤条件 @event.listens_for(Session, 'do_orm_execute') def apply_active_filter(execute_state): if execute_state.is_select and not execute_state.is_column_load: if not execute_state.execution_options.get('include_deleted', False): execute_state.statement = execute_state.statement.where( User.is_deleted == False ) # 使用示例 session.query(User).all() # 只会返回未删除的用户 session.query(User).execution_options(include_deleted=True).all() # 返回所有用户
总结
Python标记删除(软删除)是一种强大的数据管理技术,通过本教程你已学习到:
- 标记删除的核心概念及优势
- 数据库表设计的最佳实践
- Python实现标记删除的完整代码示例
- 在ORM框架中的高级实现方法
- 相关性能优化和最佳实践
在实际应用中,请根据项目需求调整实现细节,平衡数据保留策略和系统性能。
本文由TanTingYan于2025-08-10发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://521pj.cn/20257822.html
发表评论