PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

psycopg2 e script python infinito

Un pool di connessioni funziona bene per questo genere di cose. Non ci ho lavorato in produzione (usando principalmente Django o SQLAlchemy), ma psycopg2.pool include alcune diverse implementazioni (SimpleConnectionPool o PersistentConnectionPool ) che probabilmente si adatterebbe alle tue esigenze. In generale, un pool non solo aiuta a gestire le connessioni come risorsa condivisa, ma anche a testare e reinizializzare la connessione quando è necessario.

from psycopg2 import pool
conn_pool = pool.PersistentConnectionPool(minconn, maxconn, **dbopts)

def work_method():
    conn = conn_pool.getconn()
    with conn.cursor() as stmt:
        stmt.execute(sql)
    conn_pool.putconn(conn)

Il putconn è estremamente importante, in modo che un'eccezione non lasci il pool pensando che la connessione sia ancora in uso. Sarebbe bello gestirlo come un gestore di contesto:

import contextlib

@contextlib.contextmanager
def get_db_connection():
    conn = conn_pool.getconn()
    yield conn
    conn_pool.putconn(conn)

def work_method():
    with get_db_connection() as conn:
        with conn.cursor() as stmt:
            stmt.execute(sql)

Spero di esserti stato d'aiuto.