首页 > 解决方案 > 使用 FastAPI,我一直遇到 'foo' 没有属性 'bar' 问题,通常是 Session 对象

问题描述

我正在尝试按照他们网站上的 FastAPI 教程文档使用 Python、FastAPI 和 SQLAlchemy 构建股票模拟器:

FastAPI 教程

以下是希望最小的可重现代码段。我做了 test.py 来测试,通常我使用 Uvicorn 和 FastAPI 的 OpenAPI 文档。

def get_db():
    db = None

    try:
        db = SessionLocal()
        yield db
    finally:
        db.close()


# From crud.py
async def get_user(email: str, db: Session):
    return db.query(User).filter(email=email).all()


# From main.py
@app.get("/user")
async def get_current_user(email: str, db: Session = Depends(get_db)):
    user = await get_user(email, db)
    return User(user)

# From test.py
joe = asyncio.run(get_current_user("a@b.c"))

print(joe)

我不断收到此错误:

AttributeError:“依赖”对象没有属性“查询”

我已经尝试了很多东西,包括摆脱Depends和直接使用 aSessionLocal object而不是让它从生成器函数中产生。

我查看了来自 StackOverflow 的数十个错误报告、FastAPI 的 GitHub 帮助页面以及其他许多错误报告。我尝试将所有代码放在一页上并碰到同一堵墙。

当我直接使用数据库对象时:

engine.connect.execute()

对于查询和执行 SQL 代码,它可以工作,但 Depends 并没有做我读到的它应该做的事情。

有没有人有任何建议或明显的湿鱼巴掌?

标签: pythonasynchronoussqlalchemyfastapi

解决方案


你为什么要这样做?当您直接调用路径操作函数时,您会跳过“注入”依赖项的路由层,因此您将获得Depends类而不是Session对象。

您是否真的尝试遵循Async SQL 教程

当您使用异步调用时,所有协程都在同一个 OS 线程中运行,因此需要为每个请求创建一个会话。底层数据库模块使用contextvars来存储连接状态。


推荐阅读