代码有两个版本。
在第一种情况下,向 read_menus 函数传递一个数据库连接:
# router.py
@router.get("/", response_model=list[schemas.Menu])
def read_menus(db: Session = Depends(get_db)):
menus = service.get_menus(db)
if not menus:
raise HTTPException(status_code=204, detail="No menu found")
return menus
# service.py
def get_menus(db: Session = Depends(get_db)):
return db.query(models.Menu).all()
第二,在 get_menus 函数中创建数据库连接:
# router.py
@router.get("/", response_model=list[schemas.Menu])
def read_menus():
menus = service.get_menus()
if not menus:
raise HTTPException(status_code=204, detail="No menu found")
return menus
# servise.py
def get_menus():
db: Session = Depends(get_db)
return db.query(models.Menu).all()
在第一种情况下一切正常,但在第二种情况下它会出错 AttributeError: 'Depends' object has no attribute 'query'
为什么会这样?以我的理解,这两个版本的工作方式应该相同。
在第二种情况下,错误发生是因为
Depends- 是一个装饰器,用于将依赖项(例如数据库连接)注入 HTTP 请求处理程序函数。在此结构中def get_menus(): db: Session = Depends(get_db),Depends不应使用,因为不需要使用它并且会导致错误。在第一种情况下,装饰器
Depends被正确地用于将依赖项注入Session函数get_menus(),这允许该方法query()用于查询数据库。因此,为避免错误,您必须使用第一个选项,或将连接显式传递给函数
get_menus,如下所示:还值得确保该函数
get_db()正确返回到数据库的连接。