psqlpy-python / psqlpy

Asynchronous Python PostgreSQL driver written in Rust
https://psqlpy-python.github.io/
MIT License
227 stars 3 forks source link

Context manager for ConnectionPool#connection method #34

Closed Veritaris closed 4 months ago

Veritaris commented 6 months ago

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")
chandr-andr commented 6 months ago

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 commented 6 months ago

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 commented 4 months ago

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