You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的创建与关闭,更符合框架最佳实践。

  1. 修改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()
  1. 在路由或仓库类中通过依赖注入获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:11:01