2011-03-04 74 views
49

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

Estoy seguro de que el uso de cada uno de estos casos 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, ¿tiene el siguiente equivalente? 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 

Respuesta

13

Creo que de hecho depende de la implementación, pero puede hacerse 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.

+6

Encuentro diferencias en la cantidad de memoria que estos usan, con fetchall() usando la mayor cantidad de memoria. –

+0

Estos tres comandos de búsqueda me hicieron rascar la cabeza también. ¿Qué pasa si el Python en cuestión se ejecuta en el MISMO servidor que el servidor mySQL? – SMGreenfield

4

Estas son específicas 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.

Utilizará la mayor parte de la memoria.

Causa algunos problemas, puede ocurrir si las consultas se realizan en la red.

  • fetchmany

fetchmany se obtiene el número de resultados sólo se requiere. 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