MagicStack/asyncpg

Application Flow Stuck Unless Connection is Explicitly Closed

Opened this issue · 0 comments

  • asyncpg version: 0.30.0
  • PostgreSQL version: 16
  • Do you use a PostgreSQL SaaS? If so, which?: Yes, I am using NeonDB
  • Can you reproduce the issue with a local PostgreSQL install?: Didn't attempt it.
  • Python version: 3.11.0
  • Platform: Windows
  • Do you use pgbouncer?: No
  • Did you install asyncpg with pip?: Yes
  • If you built asyncpg locally, which version of Cython did you use?: [Your Cython version if applicable]
  • Can the issue be reproduced under both asyncio and
    uvloop?
    : [Yes/No] I did not try uvloop

I'm encountering an issue where the flow of my application gets stuck unless the database connection is explicitly closed after a query, even though it should be managed automatically by the context manager.

Code Example:

async def read_record(self, request_details: dict):
    """
    Retrieve records based on conditions and request_type.
    
    Args:
        request_details (dict): The conditions including request_type.
    
    Returns:
        list: The records that match the conditions.
    """
    table = self.get_table_name(request_details['request_type'])
    conditions = {key: request_details[key] for key in request_details if key != 'request_type'}
    condition_str = " AND ".join(f"{key} = ${i+1}" for i, key in enumerate(conditions.keys()))
    query = f"SELECT * FROM {table} WHERE {condition_str};"

    async with self.get_connection() as conn:
        conn.add_log_listener(lambda connection, message: logger.info("PostgreSQL log message: %s", message))
        result = await conn.fetch(query, *conditions.values())
        logger.info("Fetched records: %s", result)
        # await conn.close() # get's stuck without this line

    return result