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

Sådan bruger du serversidemarkører med psycopg2

Psycopg2 har en fin grænseflade til at arbejde med markører på serversiden. Dette er en mulig skabelon at bruge:

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 ovenfor opretter forbindelsen og placerer automatisk forespørgselsresultatet i en markør på serversiden. Værdien itersize indstiller antallet af rækker, som klienten vil trække ned ad gangen fra markøren på serversiden. Den værdi, du bruger, skal balancere antallet af netværksopkald i forhold til hukommelsesforbrug på klienten. For eksempel, hvis dit resultatantal er tre millioner, en itersize værdi på 2000 (standardværdien) vil resultere i 1500 netværksopkald. Hvis hukommelsen, der forbruges af 2000 rækker, er lav, skal du øge dette tal.

Når du bruger for row in cursor du arbejder selvfølgelig med en række ad gangen, men Psycopg2 vil forhåndshente itersize rækker ad gangen til dig.

Hvis du vil bruge fetchmany af en eller anden grund kan du gøre sådan noget:

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

Denne brug af fetchmany vil ikke udløse et netværkskald til serveren for flere rækker, før den forudhentede batch er opbrugt. (Dette er et indviklet eksempel, der ikke giver noget ud over koden ovenfor, men viser, hvordan man bruger fetchmany hvis der skulle være behov.)



  1. Sådan konfigureres PostgreSQL Sharding med ClusterControl

  2. Java Spring JPA Paginering Virker ikke, hvis mere end én side

  3. PostgreSQL's date_trunc i mySQL

  4. Er der en præstationsforskel mellem CTE, Sub-Query, Temporary Table eller Table Variable?