psqlpy icon indicating copy to clipboard operation
psqlpy copied to clipboard

Context manager for ConnectionPool#connection method

Open Veritaris opened this issue 1 year ago • 2 comments
trafficstars

ATM to use connection we need to write the following code:

connection_pool = psqlpy.ConnectionPool()
conn = await connection_pool.connection()
conn.execute("SELECT * from users")

But it would be more pythonic to use context manager here like:

connection_pool = psqlpy.ConnectionPool()
async with connection_pool.connection() as conn:
    conn.execute("SELECT * from users")

Veritaris avatar Apr 17 '24 13:04 Veritaris

Hi! Thank you for the issue.

This idea is great, but It has some cons.

We have an asynchronous connection() method because we need to make an asynchronous call to the database pool.
When we get a connection that can be used in a context manager, it must have some magical method and access to the ConnectionPool.
If we want to have 2 ways of connection declaration, we need to be available to start it explicitly, like Transaction has a begin method.
Example:

# First without context manager
...
conn = connection_pool.connection()
await conn.start()

# Second with a context manager
...
async with connection_pool.connection() as conn:

It seems a bit complicated to me with some start method for connection.
If you have another opinion please share it.

chandr-andr avatar Apr 17 '24 16:04 chandr-andr

I've started implementing this, but I'm faced with performance issues. https://github.com/qaspen-python/psqlpy/pull/36

So, it will take time to understand how to do it in another way.

chandr-andr avatar May 04 '24 12:05 chandr-andr

It's implemented in release https://github.com/qaspen-python/psqlpy/releases/tag/0.7.0 with the acquire method.

chandr-andr avatar Jul 03 '24 12:07 chandr-andr