Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

193
Views
Async Await No funciona cuando se usa en un punto final para obtener el resultado de la base de datos SQL

Soy nuevo en async await y trato de usarlo para obtener una respuesta de un método de consulta SQL db definido en un punto final

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

pero todo lo que obtengo es este error: respuesta = esperar DASDBData().get_all() TypeError: la lista de objetos no se puede usar en la expresión 'esperar'

 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

Pensé que el mensaje "---ASYNCHRONOUS---" se imprimiría primero, ya que el método get_all iría dentro de event_loop, pero tampoco se imprimió.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

TL;DR

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

A partir de los comentarios, realmente le sugiero que lea primero cómo funciona async await. Esto es lo que creo que es un buen tutorial sobre async await.

Después de leer el tutorial/explicación, comprenderá que response = await DASDBData().get_all() esperará el resultado de get_all() antes de continuar... comportándose como el código síncrono tradicional.

Ahora, si elimina la palabra clave await , su declaración de impresión se ejecutará antes de que finalice el método, pero también recibirá una advertencia acerca de que no se está esperando su rutina. Esto es similar a comenzar un proyecto, pero nunca terminarlo. La variable de respuesta contendrá la corrutina, una especie de resultado futuro, que aún no existe.

Con esto en mente, puede devolver el resultado mientras lo espera, modificando la última declaración de devolución en return (json.dumps(await response)) . Esto esperará el resultado futuro y lo volcará como una cadena antes de devolverlo.

Si necesita usar el resultado para otras cosas, puede import asyncio y luego usar response = await asyncio.gather(response) para obtener el valor de su respuesta. Esto simplemente esperará a que se ejecute la rutina y devolverá el valor resultante (es decir, la ejecución se bloquea hasta que la función devuelve algo). A continuación, puede hacer lo que quiera con el resultado.

Una nota al margen:

FastAPI convierte automáticamente el valor devuelto a JSON. A menos que esté utilizando un formato especial, le aconsejo que simplemente return await response (la espera puede ser necesaria o no, según el enfoque que utilice).

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!