sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man använder markörer på serversidan med psycopg2

Psycopg2 har ett trevligt gränssnitt för att arbeta med markörer på serversidan. Detta är en möjlig mall att använda:

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 

Koden ovan skapar anslutningen och placerar automatiskt frågeresultatet i en markör på serversidan. Värdet itersize ställer in antalet rader som klienten drar ner åt gången från markören på serversidan. Värdet du använder bör balansera antalet nätverksanrop mot minnesanvändning på klienten. Till exempel, om ditt resultat är tre miljoner, en itersize värde på 2000 (standardvärdet) kommer att resultera i 1500 nätverkssamtal. Om minnet som förbrukas av 2000 rader är svagt, öka det antalet.

När du använder for row in cursor du arbetar naturligtvis med en rad i taget, men Psycopg2 kommer att förhämta itersize rader åt gången för dig.

Om du vill använda fetchmany av någon anledning kan du göra något så här:

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

Denna användning av fetchmany kommer inte att utlösa ett nätverksanrop till servern för fler rader förrän den förhämtade batchen har förbrukats. (Detta är ett krystat exempel som inte ger något utöver koden ovan, men som visar hur man använder fetchmany om det skulle finnas ett behov.)



  1. Matrismultiplikation i python och mysql

  2. MySQL / Classic ASP - Parameteriserade frågor

  3. Flera begränsningar i tabellen:Hur får man alla överträdelser?

  4. SQLException:Före start av resultatuppsättning