【问题标题】:'async_generator is not a callable object' FastAPI dependency issue app'async_generator 不是可调用对象' FastAPI 依赖问题应用程序
【发布时间】:2021-04-18 06:37:36
【问题描述】:

我正在尝试创建一个 FastAPI 和异步 sqlalchemy。

get_db 依赖导致了一个奇怪的TypeError: <async_generator object get_db at 0x7ff6d9d9aa60> is not a callable object 问题。

这是我的代码:

db.py

from typing import Generator
from .db.session import SessionLocal

async def get_db() -> Generator:
    try:
        db = SessionLocal()
        yield db
    finally:
        await db.close()

session.py

from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from .core.config import settings

engine = create_async_engine(
    settings.SQLALCHEMY_DATABASE_URI,
    pool_pre_ping=True
)
SessionLocal = AsyncSession(
    autocommit=False,
    autoflush=False,
    bind=engine
)

我几乎遵循了此处发布的说明:https://6060ff4ffd0e7c1b62baa6c7--fastapi.netlify.app/advanced/sql-databases-sqlalchemy/#more-info

【问题讨论】:

    标签: python sqlalchemy fastapi


    【解决方案1】:

    我已经弄清楚了,基本上当您将生成器 get_db() 作为 FastAPI 端点的依赖项调用时,您基本上只需将其称为 get_db 而不带括号。

    例如:

    from typing import List, Any
    
    from fastapi import APIRouter, HTTPException, Depends, status
    from sqlalchemy.ext.asyncio import AsyncSession
    
    from . import models, crud, schemas
    from .deps.db import get_db
    
    router = APIRouter()
    
    
    @router.post('/',
                 response_model=schemas.StaffAccount,
                 status_code=status.HTTP_201_CREATED)
    async def create_staff_account(
            db: AsyncSession = Depends(get_db),
            staff_acct: schemas.StaffAccountCreate = Depends(schemas.StaffAccountCreate)
    ) -> Any:
        q = await crud.staff.create(db=db, obj_in=staff_acct)
        if not q:
            raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
                                detail='An error occurred while processing your request')
        return q
    

    这是一个很小的细节,可能会妨碍一些初学者(比如我)。所以请仔细查看您的代码。

    【讨论】:

    【解决方案2】:

    问题是

    engine = create_async_engine(
    settings.SQLALCHEMY_DATABASE_URI,
    pool_pre_ping=True
    )
    

    您正在向engine 填写一个尚未兑现的承诺。基本上,async 功能允许您在某些 I/O 或网络内容仍处于待处理状态时继续编写代码。

    因此,您将引擎作为参数传递,尽管连接可能尚未建立。

    您应该await返回引擎,然后再将其用作其他函数的参数。

    这里有一些关于 python 的async 功能的更多信息

    https://www.educba.com/python-async/

    【讨论】:

      猜你喜欢
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 2022-07-26
      • 2021-12-07
      • 2010-09-16
      • 2021-01-23
      • 2021-11-30
      • 1970-01-01
      相关资源
      最近更新 更多