在端点中使用异步等待从 SQL 数据库获取结果时不工作

Async Await Not working when using in an endpoint to fetch result from SQL database

我是 async await 的新手,正在尝试使用它从在端点定义的 SQL 数据库查询方法获取响应

@router.get('/queryDAS')
async def fetch_das_db():
response = await DASDBData().get_all()
logger.info("---ASYNCRONOUS----")
return (json.dumps(response))

但我得到的只是这个错误: 响应 = 等待 DASDBData().get_all() 类型错误:对象列表不能用于 'await' 表达式

def get_all(self):
    """Get all new data.
    @returns:
        Return list of dictionaries with team information.
    """
  
    result=[]
    statement = """SELECT *
                FROM CAE_APPR_ITEM_RESPONSE WHERE ROWNUM <= 500
                """
    logger.debug(statement)
    cur = self.connection.create_connection().cursor()
    cur.execute(statement)
    for row in cur:
        print(row)
        result.append(row)
    #return (200,result)
    return result

我认为消息“---ASYNCHRONOUS---”会首先被打印出来,因为 get_all 方法会进入 event_loop 但它也没有被打印出来

TL;DR

@router.get('/queryDAS')
async def fetch_das_db():
    response = DASDBData().get_all()
    logger.info("---ASYNCRONOUS----")
    return (json.dumps(await response))

从评论开始,我强烈建议您先阅读 async await 的工作原理。 Here is what I believe is a good tutorial 关于异步等待。

阅读完 tutorial/explanation 后,您将了解 response = await DASDBData().get_all() 将在继续之前等待 get_all() 的结果...表现得像传统的同步代码。

现在,如果您删除 await 关键字,您的打印语句将 运行 在该方法完成之前,但您还会收到一条警告,提示您的协程未被等待。这类似于开始一个项目,但永远不会结束它。因此,响应变量将保存协程,某种未来的结果,目前还没有。

考虑到这一点,您可以在等待结果的同时 return 将最后的 return 语句修改为 return (json.dumps(await response))。这将等待未来的结果并在 returning 之前将其转储为字符串。

如果您需要将结果用于其他事情,您可以 import asyncio 然后使用 response = await asyncio.gather(response) 来获取您的响应值。这将简单地等待 运行ning 协程和 return 结果值(即执行被阻塞,直到函数 returns something)。然后你可以对结果做任何你想做的事。

边注:

FastAPI 自动将 return 值转换为 JSON。除非您使用特殊格式,否则我建议简单地 return await response(根据您使用的方法,可能需要也可能不需要 await)。