fastapi中需要请求结束后关闭的数据库会话,可以写成只yield一次的依赖,在finally里释放资源,并通过depends注入。使用同步会话时采用def依赖,异步驱动则采用async def和对应异步关闭方法;项目应包含0.162.5的同步清理修复,再按响应是否仍使用资源选择scope。
把创建和关闭放在同一个依赖中
from typing import Annotated
from fastapi import Depends, FastAPI
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session, sessionmaker
engine = create_engine("sqlite:///./example.db")
SessionLocal = sessionmaker(bind=engine)
app = FastAPI()
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.get("/db-check")
def check(db: Annotated[Session, Depends(get_db)]):
return {"value": db.execute(text("SELECT 1")).scalar_one()}
示例需要FastAPI、Uvicorn和SQLAlchemy,保存为app.py后可在开发环境用uvicorn app:app启动,访问/db-check检查连接。这里演示的是同步SQLite会话,不把它直接当成异步数据库驱动用法。

FastAPI官方文档演示数据库会话的try、yield和finally
默认request作用域保留到响应发送后
带yield的依赖默认使用request作用域,退出代码在响应发送完成后运行。如果依赖只供路径函数生成普通返回值使用,可写Depends(get_db, scope="function"),让退出逻辑在函数完成后、响应发送前执行。流式响应若还要读取数据库结果,就不能过早关闭其会话。
子依赖的存活时间也要兼容:request作用域不能依赖一个在其结束前就已释放的function作用域资源。不要仅为减少连接占用给整棵依赖树统一改scope。

官方文档区分function与request依赖作用域
异常捕获不能悄悄吞掉错误
需要记录异常时,可以在依赖中添加except,但记录后应按业务语义重新raise;finally仍负责关闭。不要把取消异常转换为成功响应,也不要假定升级框架就会替应用提交或回滚所有事务。后台任务应自己创建、使用并关闭资源,避免继续使用已经退出的请求会话。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











