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

So verwenden Sie serverseitige Cursor mit psycopg2

Psycopg2 hat eine schöne Schnittstelle für die Arbeit mit serverseitigen Cursorn. Dies ist eine mögliche zu verwendende Vorlage:

with psycopg2.connect(database_connection_string) as conn:
    with conn.cursor(name='name_of_cursor') as cursor:

        cursor.itersize = 20000

        query = "SELECT * FROM ..."
        cursor.execute(query)

        for row in cursor:
            # process row 

Der obige Code erstellt die Verbindung und platziert das Abfrageergebnis automatisch in einem serverseitigen Cursor. Der Wert itersize legt die Anzahl der Zeilen fest, die der Client gleichzeitig vom serverseitigen Cursor herunterzieht. Der von Ihnen verwendete Wert sollte die Anzahl der Netzwerkaufrufe im Verhältnis zur Speicherauslastung auf dem Client ausgleichen. Wenn Ihre Ergebniszahl beispielsweise drei Millionen beträgt, eine itersize Der Wert 2000 (der Standardwert) führt zu 1500 Netzwerkaufrufen. Wenn der Speicherverbrauch von 2000 Zeilen gering ist, erhöhen Sie diese Zahl.

Bei Verwendung von for row in cursor Sie arbeiten natürlich mit jeweils einer Zeile, aber Psycopg2 wird itersize vorab abrufen Zeilen auf einmal für Sie.

Wenn Sie fetchmany verwenden möchten Aus irgendeinem Grund könnten Sie so etwas tun:

while True:
    rows = cursor.fetchmany(100)
    if len(rows) > 0:
        for row in rows:
            # process row
    else:
        break

Diese Verwendung von fetchmany löst keinen Netzwerkaufruf an den Server für weitere Zeilen aus, bis der vorab abgerufene Stapel erschöpft ist. (Dies ist ein kompliziertes Beispiel, das nichts über den obigen Code hinaus bietet, aber zeigt, wie man fetchmany verwendet sollte Bedarf bestehen.)