在端点中使用异步等待从 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)。
我是 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)。