"""请求级数据库会话依赖与引擎生命周期。 引擎由应用实例持有(create_app 时创建):一个应用一个引擎与连接池, 避免模块级引擎跨事件循环复用连接。 """ from collections.abc import AsyncIterator from typing import Annotated from fastapi import Depends, FastAPI, Request from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker from app.db.base import create_engine, create_session_factory def init_engine(app: FastAPI) -> async_sessionmaker[AsyncSession]: """在 app.state 上初始化引擎与会话工厂(应用启动时调用一次)。""" engine: AsyncEngine = create_engine() app.state.engine = engine factory = create_session_factory(engine) app.state.session_factory = factory return factory async def get_db(request: Request) -> AsyncIterator[AsyncSession]: """每请求一个会话:成功提交、异常回滚。""" factory: async_sessionmaker[AsyncSession] = request.app.state.session_factory async with factory() as session: try: yield session await session.commit() except Exception: await session.rollback() raise DbSession = Annotated[AsyncSession, Depends(get_db)]