sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo usar los cursores del lado del servidor con psycopg2

Psycopg2 tiene una buena interfaz para trabajar con cursores del lado del servidor. Esta es una posible plantilla para usar:

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 

El código anterior crea la conexión y coloca automáticamente el resultado de la consulta en un cursor del lado del servidor. El valor itersize establece el número de filas que el cliente desplegará a la vez desde el cursor del lado del servidor. El valor que utilice debe equilibrar la cantidad de llamadas de red con el uso de memoria en el cliente. Por ejemplo, si su recuento de resultados es de tres millones, un itersize El valor de 2000 (el valor predeterminado) dará como resultado 1500 llamadas de red. Si la memoria consumida por 2000 filas es poca, aumente ese número.

Al usar for row in cursor por supuesto, está trabajando con una fila a la vez, pero Psycopg2 precargará itersize filas a la vez para usted.

Si desea utilizar fetchmany por alguna razón, podrías hacer algo como esto:

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

Este uso de fetchmany no activará una llamada de red al servidor para obtener más filas hasta que se haya agotado el lote precargado. (Este es un ejemplo complicado que no proporciona nada sobre el código anterior, pero demuestra cómo usar fetchmany en caso de necesidad.)