Asyn c Await Не работает при использовании в конечной точке для получения результата из SQL базы данных - PullRequest
1 голос
/ 02 августа 2020

Я новичок в asyn c await и пытаюсь использовать его для получения ответа от метода запроса SQL db, определенного в конечной точке

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

, но все, что я получаю, это ошибка: response = await DASDBData (). get_all () TypeError: список объектов нельзя использовать в выражении '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 будет go внутри event_l oop, но он также не был напечатан

1 Ответ

2 голосов
/ 03 августа 2020

TL; DR

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

Начиная с комментариев, я действительно предлагаю вам сначала прочитать, как работает asyn c await. Вот то, что я считаю хорошим учебником об asyn c await.

После того, как вы прочтете руководство / объяснение, вы поймете, что response = await DASDBData().get_all() будет ждать результата из get_all(), прежде чем продолжить ... вести себя как традиционный синхронный код.

Теперь, если вы удалите ключевое слово await, ваш оператор печати будет запущен до завершения метода, но вы также получить предупреждение о том, что ваша сопрограмма не ожидается. Это похоже на начало проекта, но никогда не заканчивая его. Таким образом, переменная ответа будет содержать сопрограмму, своего рода будущий результат, которого еще нет. *. Это будет ждать будущего результата и сбрасывать его в виде строки, прежде чем возвращать его.

Если вам нужно использовать результат для некоторых других вещей, вы можете import asyncio, а затем использовать response = await asyncio.gather(response), чтобы получить значение ответа . Это просто дождется работающей сопрограммы и вернет результирующее значение (т.е. выполнение будет заблокировано до тех пор, пока функция что-то не вернет). Затем вы можете делать с результатом все, что захотите.

Примечание с одной стороны:

FastAPI автоматически преобразует возвращаемое значение в JSON. Если вы не используете специальное форматирование, я советую просто return await response (ожидание может понадобиться, а может и не понадобиться, в зависимости от того, какой подход вы используете).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...