PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment utiliser les curseurs côté serveur avec psycopg2

Psycopg2 a une belle interface pour travailler avec des curseurs côté serveur. Voici un modèle possible à utiliser :

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 

Le code ci-dessus crée la connexion et place automatiquement le résultat de la requête dans un curseur côté serveur. La valeur itersize définit le nombre de lignes que le client déroulera à la fois à partir du curseur côté serveur. La valeur que vous utilisez doit équilibrer le nombre d'appels réseau par rapport à l'utilisation de la mémoire sur le client. Par exemple, si votre nombre de résultats est de trois millions, un itersize valeur de 2000 (la valeur par défaut) entraînera 1500 appels réseau. Si la mémoire consommée par 2000 lignes est faible, augmentez ce nombre.

Lors de l'utilisation de for row in cursor vous travaillez bien sûr avec une ligne à la fois, mais Psycopg2 prélèvera itersize lignes à la fois pour vous.

Si vous souhaitez utiliser fetchmany pour une raison quelconque, vous pourriez faire quelque chose comme ceci :

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

Cette utilisation de fetchmany ne déclenchera pas d'appel réseau vers le serveur pour plus de lignes tant que le lot prélu n'aura pas été épuisé. (Ceci est un exemple compliqué qui ne fournit rien sur le code ci-dessus, mais montre comment utiliser fetchmany en cas de besoin.)