one fetchone python mysql python-db-api

Python db-api: fetchone vs fetchmany vs fetchall



fetchone pymysql (2)

Creo que de hecho depende de la implementación, pero puedes hacerte una idea de las diferencias al buscar fuentes MySQLdb. Dependiendo de las opciones, mysqldb fetch * mantiene el conjunto actual de filas en la memoria o en el servidor, por lo que fetchmany vs fetchone tiene cierta flexibilidad para saber qué guardar en la memoria (python) y qué mantener db server side.

PEP 249 no da muchos detalles, así que supongo que esto es para optimizar las cosas dependiendo de la base de datos, mientras que la semántica exacta está definida por la implementación.

Acabo de tener una discusión hoy con algunos compañeros de trabajo sobre db-api fetchone de python vs fetchmany vs fetchall.

Estoy seguro de que el caso de uso para cada uno de estos depende de la implementación del db-api que estoy usando, pero, en general, ¿cuáles son los casos de uso para fetchone vs fetchmany vs fetchall?

En otras palabras, ¿son los siguientes equivalentes? o hay uno de estos que se prefiere sobre los otros? y si es así, ¿en qué situaciones?

cursor.execute("SELECT id, name FROM `table`") for i in xrange(cursor.rowcount): id, name = cursor.fetchone() print id, name cursor.execute("SELECT id, name FROM `table`") result = cursor.fetchmany() while result: for id, name in result: print id, name result = cursor.fetchmany() cursor.execute("SELECT id, name FROM `table`") for id, name in cursor.fetchall(): print id, name


Estos son específicos de la implementación.

  • fetchall

Obtendrá todos los resultados de la tabla. Esto funcionará mejor cuando el tamaño de la mesa sea pequeño. Si el tamaño de la tabla es más grande, fetchall fallará en esos casos.

Usará la mayor parte de la memoria.

Puede causar algunos problemas si las consultas se realizan en la red.

  • fetchmany

fetchmany obtendrá solo el número requerido de resultados. Puede ceder los resultados y el proceso. Fragmento simple de implementación de fetchmany.

while True: results = cursor.fetchmany(arraysize) if not results: break for result in results: yield result