PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

psycopg2 und unendliches Python-Skript

Ein Verbindungspool eignet sich gut für solche Dinge. Ich habe nicht damit in der Produktion gearbeitet (hauptsächlich mit Django oder SQLAlchemy), aber psycopg2.pool enthält einige verschiedene Implementierungen (SimpleConnectionPool oder PersistentConnectionPool ), die wahrscheinlich Ihren Anforderungen entsprechen würden. Im Allgemeinen hilft ein Pool nicht nur beim Verwalten von Verbindungen als gemeinsam genutzte Ressource, sondern auch beim Testen und erneuten Initialisieren der Verbindung, wenn dies erforderlich ist.

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)

Der putconn ist extrem wichtig, damit eine Ausnahme den Pool nicht verlässt und denkt, dass die Verbindung noch verwendet wird. Wäre gut, es als Kontextmanager zu handhaben:

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)

Hoffe das hilft.