Estoy buscando un patrón en el que tengo varias funciones que necesitan acceso a un recurso que se administra en contexto.
En particular, estoy usando fastAPI y quiero reutilizar las aiopg (async psycopg2 ).
Este es el diseño básico:
@app.get("/hello") def hello(): async with aiopg.connect(...) as conn: async with conn.cursor(...): return cursor.execute(...) Ahora quiero evitar una conexión por ruta. Podría pensar en un objeto externo, y en la ruta accedo a la propiedad conn o espero la creación (y la almaceno) y luego solo uso el método with on the cursor() .
class Pg(): async def conn(self): if not self._conn: self._conn = await aiopg.connect(...) return self._conn myPg = Pg() @app.get("/hello") def hello(): conn = await myPg.conn() async with conn.cursor(...): return cursor.execute(...)Sin embargo, entonces perdería la capacidad de cerrar automáticamente la conexión.
Creo que me perdí algo realmente obvio aquí y espero que alguien pueda guiarme sobre cómo implementar esto correctamente.
¡Gracias!
aiopg proporciona una clase Pool que puede administrar conexiones.
simplemente cree una instancia de grupo en el nivel del módulo:
pool = await aiopg.create_pool('<your connection string>') Luego puede usar el administrador de contexto Pool.acquire para obtener una conexión:
async with pool.acquire() as conn: ...Si ya existen conexiones en el grupo, se volverán a utilizar.