sql >> Database >  >> RDS >> PostgreSQL

Cursors aan de serverzijde gebruiken met psycopg2

Psycopg2 heeft een mooie interface voor het werken met server-side cursors. Dit is een mogelijke sjabloon om te gebruiken:

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 

De bovenstaande code maakt de verbinding en plaatst het queryresultaat automatisch in een cursor aan de serverzijde. De waarde itersize stelt het aantal rijen in dat de client per keer vanaf de servercursor naar beneden haalt. De waarde die u gebruikt, moet het aantal netwerkoproepen in evenwicht houden met het geheugengebruik op de client. Als uw aantal resultaten bijvoorbeeld drie miljoen is, wordt een itersize waarde van 2000 (de standaardwaarde) resulteert in 1500 netwerkoproepen. Als het geheugen dat door 2000 rijen wordt verbruikt licht is, verhoogt u dat aantal.

Bij gebruik van for row in cursor je werkt natuurlijk met één rij tegelijk, maar Psycopg2 zal itersize prefetchen rijen tegelijk voor u.

Als u fetchmany wilt gebruiken om de een of andere reden zou je zoiets als dit kunnen doen:

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

Dit gebruik van fetchmany activeert geen netwerkaanroep naar de server voor meer rijen totdat de vooraf opgehaalde batch is uitgeput. (Dit is een ingewikkeld voorbeeld dat niets boven de bovenstaande code biedt, maar laat zien hoe fetchmany te gebruiken mocht dat nodig zijn.)



  1. FOUT:plan in cache mag het resultaattype niet wijzigen bij het mixen van DDL met SELECT via JDBC

  2. Hoe rechtvaardigt_days() werkt in PostgreSQL

  3. WCF, MySQL en transactie

  4. Unieke identifier (guid) als primaire sleutel in databaseontwerp