必须用yield不能return,否则连接不释放致池耗尽;正确写法是async with+try/finally,确保commit/rollback/close在请求生命周期内执行。

async def get_db() 必须用 yield,不能 return
FastAPI 依赖注入系统只靠 yield 识别资源清理时机。写成普通函数直接 return db,会导致连接永不关闭、池子被耗尽、事务残留锁——这些错误不会立刻报错,而是悄无声息地拖垮服务。
正确写法是用 async with 包裹会话,并在 try/except/finally 中显式控制生命周期:
async def get_db() -> AsyncIterator[AsyncSession]:
async with AsyncSessionLocal() as session:
try:
yield session
await session.commit()
except Exception:
await session.rollback()
raise
finally:
await session.close()
-
yield session是关键信号,告诉 FastAPI:这个对象要在请求结束时回收 -
await session.commit()放在try块末尾,确保正常流程提交 -
await session.rollback()捕获异常后回滚,避免脏数据滞留 -
await session.close()在finally里执行,无论成功失败都释放资源
连接池参数不配对,异步优势直接归零
用 create_async_engine 初始化引擎时,如果只设 pool_size=5 却忽略 max_overflow 或关掉 pool_pre_ping,高并发下大概率出现 ConnectionResetError 或 InterfaceError: connection already closed。
推荐组合(PostgreSQL + asyncpg):
-
pool_size=10:常驻连接数,建议设为 CPU 核心数 × 2 + 1 -
max_overflow=20:突发流量时允许临时超限,避免拒绝连接 -
pool_recycle=300:强制每 5 分钟重置连接,防止数据库端主动断连导致的 stale connection -
pool_pre_ping=True:每次从池中取出连接前先发一个SELECT 1探活,开销极小但能拦住 90% 的“连接已失效”错误
BackgroundTasks 里不能传 Session,得自己 new
你在路径函数里拿到的 db: AsyncSession 是绑定当前请求生命周期的。一旦响应返回,FastAPI 就会触发 yield 后面的清理逻辑——这时候再把它塞进 BackgroundTasks,任务执行时大概率遇到 StatementError: This Session's transaction is closed。
后台任务必须独立建连:
- 不要把
db当参数传进去 - 在任务函数内部调用
AsyncSessionLocal()新建会话 - 务必用
async with+try/finally自行管理关闭 - 若任务需多次访问 DB,可封装成带
async contextmanager的工具函数复用逻辑
测试时 db_pool 要用 session scope,别用 function
Pytest 默认每个测试函数跑一次 fixture,如果给 db_pool 设成 scope="function",每测一个接口就新建销毁一次连接池——既慢又容易触发 PostgreSQL 的 too many connections 错误。
正确做法是提升作用域到会话级:
@pytest.fixture(scope="session")
async def db_pool():
pool = await asyncpg.create_pool(DATABASE_URL)
yield pool
await pool.close()
配合 httpx.AsyncClient fixture 使用时,也要注意生命周期对齐:client 用 scope="function",因为它依赖 app 实例;而 pool 和 engine 这类重型资源,只初始化一次就够了。
最容易被忽略的一点:lifespan 里 engine.dispose() 和测试 fixture 里的 pool.close() 不是同一套机制,别混用。生产走 lifespan,测试走 fixture,边界必须划清。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











