I am looking for a pattern where I have multiple functions that need access to a resource that is context-managed.
In particular, I am using fastAPI and want to re-use aiopg (async psycopg2) connections.
This is the basic layout:
@app.get("/hello")
def hello():
async with aiopg.connect(...) as conn:
async with conn.cursor(...):
return cursor.execute(...)
Now I want to avoid a connection per route. I could think of an object outside, and in the route I either access the conn property or await creation (and store back) and then just use the with on the cursor() method.
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(...)
However, I then would lose the ability to automatically close the connection.
I think that I miss something really obvious here and hope that someone could guide me how to implement this properly.
Thanks!