FastAPI初始化DB Session报错:AttributeError: 'generator'无'query'属性
解决FastAPI中数据库Session的AttributeError问题
问题根源
你的create_new_session()方法使用了yield,属于生成器函数,直接调用它返回的是生成器对象,而非SQLAlchemy的Session实例,因此调用db_session.query()时会触发'generator' object has no attribute 'query'错误。
修复方案
方案1:手动获取生成器中的Session
在仓库代码里,通过next()取出生成器产生的Session实例:
db_session = next(Database.create_new_session()) vendor_response_model = ( db_session.query(VendorResponseModel) .filter(VendorResponseModel.hash_key == hash_key) .order_by(desc(VendorResponseModel.dt_created)) .limit(1) .first() ) return self.from_orm(vendor_response_model)
方案2:用FastAPI依赖注入管理Session(推荐)
FastAPI原生支持处理带yield的生成器依赖,会自动完成Session的创建与关闭,更符合框架最佳实践。
- 修改
database.py,将会话生成器改为可注入的依赖:
from fastapi import Depends # 保留原有其他代码... @staticmethod def get_db() -> Generator[Session, None, None]: """供FastAPI依赖注入使用的数据库会话生成器""" db = Database.__get_session() try: yield db finally: db.close()
- 在路由或仓库类中通过依赖注入获取Session:
- 路由直接使用示例:
from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from .database import Database router = APIRouter() @router.get("/vendor/{hash_key}") def get_vendor(hash_key: str, db: Session = Depends(Database.get_db)): vendor_response_model = ( db.query(VendorResponseModel) .filter(VendorResponseModel.hash_key == hash_key) .order_by(desc(VendorResponseModel.dt_created)) .limit(1) .first() ) return vendor_response_model
- 仓库类调用示例:
class VendorRepository: def get_latest_vendor(self, hash_key: str, db: Session): vendor_response_model = ( db.query(VendorResponseModel) .filter(VendorResponseModel.hash_key == hash_key) .order_by(desc(VendorResponseModel.dt_created)) .limit(1) .first() ) return self.from_orm(vendor_response_model)
之后在路由中注入Session并传递给仓库方法即可。
额外说明
- 生成器函数调用后不会立即执行逻辑,仅返回生成器对象,需通过
next()或遍历操作获取实际的Session实例。 - FastAPI的依赖注入会自动管理生成器依赖的生命周期:请求开始时执行到
yield获取Session,请求结束后执行finally块关闭Session,无需手动处理。
内容的提问来源于stack exchange,提问作者LMF
相关产品推荐
相关产品推荐

