FastAPI系列-19-数据操作之删除
本文阐述在图书管理API中采用软删除方案,将删除操作转换为UPDATE语句,在deleted_at列写入UTC时间戳而非物理删除,以实现数据可逆恢复与审计完整。所有面向用户的查询必须在DAO层统一附加deleted_at IS NULL过滤,确保已删除行对业务透明,避免幽灵数据。删除时使用SQLAlchemy Core的update,根据rowcount判断资源是否存在或已被删除,统一抛出NotF...
发现更多有趣的博主。
43 篇订阅本文阐述在图书管理API中采用软删除方案,将删除操作转换为UPDATE语句,在deleted_at列写入UTC时间戳而非物理删除,以实现数据可逆恢复与审计完整。所有面向用户的查询必须在DAO层统一附加deleted_at IS NULL过滤,确保已删除行对业务透明,避免幽灵数据。删除时使用SQLAlchemy Core的update,根据rowcount判断资源是否存在或已被删除,统一抛出NotF...
文章介绍如何使用SQLAlchemy Core层的乐观锁机制解决并发更新冲突。核心方案是在数据表中增加`version`列,更新时通过`UPDATE ... SET version = version + 1 WHERE id = ? AND version = ?`语句,利用数据库原子性地检测版本冲突。关键在于`version`的自增必须使用SQL表达式而非Python预计算值,以确保并发安全。...
本文介绍了基于ORM的异步新增操作,核心流程为三步:`db.add(book)` 同步将对象登记到Session,不产生I/O;`await db.commit()` 异步执行flush生成INSERT并提交事务,释放行锁并回填自增ID;`await db.refresh(book)` 异步拉取数据库端生成的默认值(如created_at)。事务边界由`async with get_async_d...
本文介绍了在FastAPI中将图书列表接口从全表查询升级为支持按作者、状态、关键词过滤以及分页与聚合的完整异步查询方案。核心思路是引入DAO层隔离路由与ORM,路由仅负责参数校验和调用,DAO使用SQLAlchemy 2.x的`select`惰性组合`where`条件(等值、`ilike`模糊匹配、`in_`集合过滤),并通过`func.count`直接进行数据库聚合统计,以`ORDER BY`加...
摘要:作者实习接手一个全栈项目,缺乏文档和指导,独自用AI搭建后端前端,老板催得紧。上线时因环境混乱问题频发,被迫加班至深夜。对比前司的轻松,感到压力巨大、身心俱疲,甚至怀念童年无忧无虑的时光。
深夜被手机地震警报惊醒,瞬间接受了“13楼小震不用跑,大震跑不掉”的现实,淡定截屏后继续倒头大睡,展现了一颗“随遇而安”的强心脏。
本文将路由层的占位端点改造为基于异步SQLAlchemy ORM的真实MySQL查询。核心机制是通过`Depends(get_async_db)`按请求作用域注入`AsyncSession`,路由处理函数只需`await db.execute(select(Book))`即可完成查询,结果通过`scalars()`映射为ORM实例并序列化输出。整个过程严格遵循一次请求一个Session、业务代码不...
本文介绍了在 SQLAlchemy 2.x 中通过声明式基类 `DeclarativeBase`、`Mapped` 类型注解和 `mapped_column` 将 Python 类映射为 MySQL 表的核心做法。`ForeignKey` 在数据库层建立外键约束,`relationship` 则提供 ORM 层的对象导航,二者职责不同但协同工作。建表时需在启动流程中导入模型包以注册元数据,再通过 ...
本文介绍了在FastAPI异步环境中搭建SQLAlchemy ORM基础的四件套:应用级单例Engine(通过`create_async_engine`管理aiomysql连接池)、`async_sessionmaker`工厂(按请求创建独立`AsyncSession`)、声明式基类`Base`(统一注册模型元数据)以及`yield`依赖函数`get_async_db`(请求始建会话,响应后自动关...
独自吃饭、旅行、做所有事都不可悲,真正可悲的是因为找不到人陪,就放弃去做那些自己真正想做的事。享受独立,才是生活的勇气。