Tuesday, 3 October 2023

psycopg3 pool "connection is closed"

I have set up a decorator to provide my db connection using psycopg3 and I sometimes have it passing a connection that is closed and throwing the following error when I try to use it:

the connection is closed

Here is my implementation:

master_connection_pool = psycopg_pool.ConnectionPool(
    conninfo=masterDbConnectionString,
    min_size=5,
    open=True
)

def provide_db(func):
    """
    Function decorator that provides a session if it isn't provided.
    """

    @wraps(func)
    def wrapper(*args, **kwargs):
        arg_session = 'db'

        func_params = func.__code__.co_varnames
        session_in_args = arg_session in func_params and \
                          func_params.index(arg_session) < len(args)
        session_in_kwargs = arg_session in kwargs

        if session_in_kwargs and kwargs[arg_session] is not None:
            return func(*args, **kwargs)
        if session_in_args and args[func_params.index(arg_session)] is not None:
            return func(*args, **kwargs)
        else:
            with master_connection_pool.connection() as conn:
                conn.row_factory = dict_row
                kwargs[arg_session] = conn
                return func(*args, **kwargs)

    return wrapper

Then in my app I can do this:

@provide_db
def do_Stuff(user_id, db):
    db.query(f"SELECT * FROM users WHERE id={user_id}")
    ...

What is the proper way to reconnect or prevent this from happening, this is a webapp so its a long running process.



from psycopg3 pool "connection is closed"

No comments:

Post a Comment