Почему выводит ошибку AttributeError?
Существует две версии кода.
В первом случае функции 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'
Почему так происходит? В моем понимании Обе версии должны работать идентично.
Ответы (1 шт):
Во втором случае ошибка возникает потому, что Depends - это декоратор, который используется для внедрения зависимостей, таких как соединение с базой данных, в функции-обработчики HTTP запросов. В данной конструкции def get_menus(): db: Session = Depends(get_db), Depends не должен быть использован, так как над его использованием нет надобности и он вызывает ошибку.
В первом случае декоратор Depends правильно используется для внедрения зависимости Session в функцию get_menus() и это позволяет использовать метод query() для выполнения запросов к базе данных.
Поэтому, чтобы избежать ошибки, нужно либо использовать первый вариант, либо передать соединение явно в функцию get_menus, как показано ниже:
def get_menus(db: Session):
return db.query(models.Menu).all()
def read_menus():
db = get_db()
menus = service.get_menus(db)
if not menus:
raise HTTPException(status_code=204, detail="No menu found")
return menus
Также стоит убедиться, что функция get_db() корректно возвращает соединение с базой данных.