alanezz / Syllabus-2019-1

26 stars 13 forks source link

psycopg2 cursores #102

Closed javalenzuela3 closed 5 years ago

javalenzuela3 commented 5 years ago

Hola! Estaba viendo la documentación de psycopg2 y vi que los cursores son iterables. Entonces me surgió la duda de por que usabamos .fetchone() si en cambio podemos simplemente iterar sobre ellos. Aquí el link de lo que digo: http://initd.org/psycopg/docs/cursor.html Y en cuanto a la prueba, si nos piden algo que no se cargue en memoria, podemos usarlos de esta manera o solamente con .fetchone()? Gracias!

cmp831 commented 5 years ago

Hola, la manera en que los cursores son iterados es: hacer fetchall() y guardar todos las columnas en la memoria del cliente, luego iterar sobre ellas. Dado una consulta puede contener muchos datos, esto llenará la memoria del cliente. Como puedes ver, no lo podrás usar en la prueba.

En la implementación real, este cursor son "regeneradas" en batches con el tamaño de iteraciones definidas, puedes revisarlo acá. Obviamente esto no es excusa de usarlo en la prueba. En la vida real, si no quieres hacer fetchone() dado que es relativamente lento (se debe communicar con el servidor por cada fila de la consulta), puedes usar server side cursor, (que tampoco lo puedes utilizar en la prueba jajaja).