python - 使用 FastAPI,我一直遇到 'foo' 没有属性 'bar' 问题,通常是 Session 对象
问题描述
我正在尝试按照他们网站上的 FastAPI 教程文档使用 Python、FastAPI 和 SQLAlchemy 构建股票模拟器:
以下是希望最小的可重现代码段。我做了 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 并没有做我读到的它应该做的事情。
有没有人有任何建议或明显的湿鱼巴掌?
解决方案
你为什么要这样做?当您直接调用路径操作函数时,您会跳过“注入”依赖项的路由层,因此您将获得Depends
类而不是Session
对象。
您是否真的尝试遵循Async SQL 教程?
当您使用异步调用时,所有协程都在同一个 OS 线程中运行,因此需要为每个请求创建一个会话。底层数据库模块使用contextvars来存储连接状态。
推荐阅读
- powershell - PowerShell 第 2 轮中的 Git Config 双引号
- java - 如何以 LANDSCAPE 格式打印 jTextPane 内容
- flutter - Flutter 多 TextFields 和简单的 claulation o 按钮
- html - 带有链接边注的表格页脚在文本中创建大中断
- django - 使用 3 个操作标志自定义 Django 日志条目 Change_Message 字段
- selenium - 如何编写自动化脚本来识别列表的节点索引,并使用 xpath 链接文本“设置第一个项目”
- python - 无法将数据框保存到镶木地板 pyspark
- python - 如果新表包含新数据 python pandas,则将行附加到现有表
- aws-step-functions - 在 AWS Stepfunctions 中,当 Catch 错误时,如何识别哪个状态引发了错误?(传递一个字符串文字加上当前状态名称)
- typescript - 当我选择文本时,onDidChangeTextEditorSelection 不会触发