📅 2026年7月1日 · LangGraph状态管理 · FastAPI全栈 · PostgreSQL高级特性0. 今日学习地图昨天我们完成了项目全景认知和Python异步编程基础,今天正式进入工程地基的构建。内容从LangGraph的高级状态管理、记忆机制,到FastAPI API层开发,再到PostgreSQL数据库的高级特性,是真正"动手写代码"的一天。今日三大模块LangGraph进阶Reducer 合并规则Checkpointer 记忆条件分支路由FastAPI 全栈Pydantic自动校验Depends依赖注入SSE流式响应文件上传/异常处理PostgreSQLUUID主键JSON字段查询ON CONFLICT触发器1. 异步上下文管理器深度解析昨天我们简单提到了@asynccontextmanager,今天从原理层面彻底搞懂它。上下文管理器的核心目的只有一个:保证资源一定被释放,无论中间是否发生异常。同步上下文管理器原理任何实现了__enter__和__exit__魔法方法的对象,都可以配合with使用:classDatabaseConnection:def__enter__(self):# 进入 with 块时执行:建立连接self.conn=create_connection()returnself.conndef__exit__(self,exc_type,exc_val,exc_tb):# 退出 with 块时执行:关闭连接(即使报错也会执行)self.conn.close()# 返回 False 表示不吞掉异常,向上抛出returnFalse# 使用方式withDatabaseConnection()asconn:conn.query("SELECT ...")# 离开作用域,连接自动关闭异步版本:aenter和aexit异步场景下(数据库连接、网络请求都是异步IO),魔法方法变成了__aenter__和__aexit__,配合async with使用:异步 async with 执行流程正常执行发生异常await __aenter__异步获取资源执行 async with 块内代码await __aexit__异步释放资源同步 with 执行流程正常执行发生异常调用 __enter__获取资源执行 with 块内代码调用 __exit__释放资源图1:同步withvs 异步async with执行生命周期对比简化写法:@asynccontextmanager手写魔法方法太繁琐,Python 标准库提供了装饰器简化写法,通过生成器 + yield优雅实现:fromcontextlibimportasynccontextmanager@asynccontextmanagerasyncdefget_db():# yield 之前:相当于 __aenter__conn=awaitasyncpg.connect(DATABASE_URL)try:yieldconn# 把连接交给调用方使用finally:# yield 之后:相当于 __aexit__,无论是否报错都执行awaitconn.close()# 使用asyncdefquery_user(user_id:int):asyncwithget_db()asconn:row=awaitconn.fetchrow("SELECT * FROM users WHERE id = $1",user_id)returnrow# 此处连接已确保关闭⚠️讲师踩坑提醒:yield 后的清理代码必须放在finally块中,否则当async with块内抛出异常时,清理代码不会执行,导致资源泄漏。2. LangGraph 进阶:从线性图到智能工作流2.1 条件边(Conditional Edges):让图学会"思考走哪条路"昨天我们学了固定边add_edge,它只能实现线性流程 A→B→C。而真正的智能体需要根据状态动态决策下一步,这就需要条件边。conceptcodechat