新闻详情

新闻详情

首页 / 资讯中心 / 详情

FastAPI + SQLAlchemy 异步会话(AsyncSession)核心方法

发布时间:2026/9/4 18:33:55来源:尧图网络
FastAPI + SQLAlchemy 异步会话(AsyncSession)核心方法
一、事务处理核心流程1. 标准事务生命周期增、删、改# 顺序标记操作 → 执行SQL并提交 → 刷新对象 async with AsyncSessionLocal() as db: # ① 纯内存标记操作不发送SQL不需要 await db.add(new_object) # 新增纯内存 db.add_all([obj1, obj2]) # 批量新增纯内存 # ② 标记删除 自动刷新检查可能发送 SQL需要 await await db.delete(existing_object) # 逻辑标记触发autoflush检查 # 注意delete 虽然逻辑是标记但因为内部可能触发flush所以必须 await # 或者执行更新语句发送SQL需要 await stmt update(...).where(...).values(...) await db.execute(stmt) # 立即发送SQL需要 await # ③ 提交事务发送SQL到数据库永久落盘需要 await await db.commit() # ④ 刷新对象从数据库查回来需要 await await db.refresh(new_object)2. 查询流程只读操作# 查询通常不需要 commit只需执行并读取结果 result await db.execute(select(News).where(...)) # 执行查询返回 Result 对象 items result.scalars().all() # 提取 Python 对象列表二、各方法作用详解方法调用时机作用是否发送SQLdb.add(obj)新增数据时将对象标记为“待插入”加入会话的工作队列。❌ 否db.add_all([obj1, obj2])批量新增将多个对象标记为“待插入”。❌ 否await db.delete(obj)删除数据时将对象标记为“待删除”。❌ 否await db.execute(stmt)执行任意SQL含select/update/delete/insert1. 将SQL语句发送给数据库服务器执行。2. 返回Result对象包含影响行数、游标等。3. 对于update/delete数据在数据库内存Buffer Pool中已变更但事务未提交其他连接不可见。✅ 是await db.commit()必须在所有增、删、改操作之后调用1. 将当前事务中的所有变更add/delete/execute永久写入磁盘。2. 释放数据行上的锁。3. 使变更对其他数据库连接可见。4. 若在此前代码抛异常且未捕获事务会自动回滚所有变更撤销。✅ 是提交指令await db.refresh(obj)调用commit()之后通常是新增/更新后从数据库重新查询该对象的最新状态刷新本地内存属性如获取自增id、数据库默认值、计算列等。✅ 是查询await db.rollback()发生异常需要撤销变更时撤销当前事务中所有未提交的变更利用 Undo Log 回滚数据。✅ 是回滚指令await db.flush()在commit前需要提前获取数据库生成的ID时极少手动调用提前将 SQL 发送到数据库执行写入内存但不提交事务。数据仍处于当前事务中其他连接不可见可通过rollback撤销。✅ 是三、事务自动管理上下文管理器使用async with AsyncSessionLocal() as db:时会自动在代码块结束时执行close()归还连接到池。但它不会自动commit仍需显式调用。若代码块内抛异常且未显式调用commit会话会在关闭时自动执行rollback。四、result.rowcount和commit的关系result.rowcount由execute执行后立即从数据库返回表示本次 SQL 语句影响了数据库内存中的多少行。此值不依赖commit即使未提交值也已获取。commit将内存变更持久化到磁盘并释放锁。若省略commit内存变更会在会话关闭时被rollback撤销。五、典型代码范例增、改、删1. 新增 获取自增IDnew_news News(title标题, content内容) db.add(new_news) await db.commit() # 此时数据库已插入ID已生成 await db.refresh(new_news) # 将生成的ID加载到本地对象 return new_news.id2. 更新方式一对象属性修改result await db.execute(select(News).where(News.id id)) news result.scalar_one() news.title 新标题 await db.commit() # 自动检测到对象变更生成UPDATE发送3. 更新方式二批量更新不查询stmt update(News).where(News.category_id 1).values(viewsNews.views 1) result await db.execute(stmt) await db.commit() return result.rowcount # 返回受影响行数4. 删除news await db.get(News, id) if news: await db.delete(news) await db.commit()
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

基于OpenFAST与Simulink的风电机组独立变桨MPC控制联合仿真实践 2026/9/4 19:28:11

基于OpenFAST与Simulink的风电机组独立变桨MPC控制联合仿真实践

简介:本资源面向风电控制领域研究生、科研工程师及控制系统开发者,提供一套基于OpenFAST v3.4.0与Simulink联合仿真的独立变桨-模型预测控制(IPC-MPC)完整实现方案,解决风电机组多变量、强耦合、含约束条件下的高精度协…

阅读更多 →
从零构建心电采集系统:硬件设计、PCB布局与嵌入式固件开发全流程 2026/9/4 19:28:11

从零构建心电采集系统:硬件设计、PCB布局与嵌入式固件开发全流程

简介:本资源是一套完整的心电采集系统开发套件,面向电子工程师、嵌入式开发者及医疗设备研发人员,解决从生物信号采集、硬件实现到软件控制的全链路设计问题,适用于便携式心电仪原型开发、课程设计与毕业设计等实践场景。压缩包共…

阅读更多 →
LangGraph与MCP实战:构建能调用工具的AI智能体工作流 2026/9/4 19:28:11

LangGraph与MCP实战:构建能调用工具的AI智能体工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
虚拟同步发电机正负序阻抗建模:从原理到MATLAB/Simulink仿真实践 2026/9/4 19:28:11

虚拟同步发电机正负序阻抗建模:从原理到MATLAB/Simulink仿真实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
思想论战如何以一次代码提交收场?开源中的Drive-by PR现象 2026/9/4 19:28:11

思想论战如何以一次代码提交收场?开源中的Drive-by PR现象

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
基于FFT相位相关的图像配准:原理、Matlab实现与工程优化 2026/9/4 19:25:10

基于FFT相位相关的图像配准:原理、Matlab实现与工程优化

简介:本资源是一套面向图像处理初学者与MATLAB实践者的FFT图像配准入门方案,聚焦于快速估算两幅图像间的粗略平移参数,适用于遥感影像对齐、医学图像预配准、多视角图像融合等需高效初配准的场景。压缩包共6个文件(3幅JPG测试图像…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞