簡體   English   中英

'async_generator 不是可調用對象' FastAPI 依賴問題應用程序

[英]'async_generator is not a callable object' FastAPI dependency issue app

我正在嘗試創建一個 FastAPI 和異步 sqlalchemy。

get_db 依賴會導致奇怪的TypeError: <async_generator object get_db at 0x7ff6d9d9aa60> is not a callable object問題。

這是我的代碼:

數據庫.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

問題是

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

您正在用 promise 填充engine ,但必須完成。 基本上, async功能允許您使用代碼 go,而某些 I/O 或網絡內容仍處於待處理狀態。

因此,您將引擎作為參數傳遞,盡管連接可能尚未建立。

在將其用作其他函數的參數之前,您應該await引擎的返回。

這是有關 python 的async功能的更多信息

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

我已經弄清楚了,基本上當您將生成器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

這是一個很小的細節,可能會妨礙一些初學者(比如我)。 因此,請更仔細地查看您的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM