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.)