Pregunta

Hay varias formas de iterar sobre un conjunto de resultados.¿Cuáles son las ventajas y desventajas de cada uno?

¿Fue útil?

Solución

La forma canónica es utilizar el iterador de cursor incorporado.

curs.execute('select * from people')
for row in curs:
    print row

Puedes usar fetchall() para obtener todas las filas a la vez.

for row in curs.fetchall():
    print row

Puede resultar conveniente utilizar esto para crear una lista de Python que contenga los valores devueltos:

curs.execute('select first_name from people')
names = [row[0] for row in curs.fetchall()]

Esto puede resultar útil para conjuntos de resultados más pequeños, pero puede tener efectos secundarios negativos si el conjunto de resultados es grande.

  • Debe esperar a que todo el resultado se devuelva al proceso de su cliente.

  • Puede comer mucha memoria en su cliente para mantener la lista acumulada.

  • Python puede tardar un tiempo en construir y deconstruir la lista que va a descartar inmediatamente de todos modos.


Si sabe que se devuelve una sola fila en el conjunto de resultados, puede llamar fetchone() para obtener la fila única.

curs.execute('select max(x) from t')
maxValue = curs.fetchone()[0]

Finalmente, puede recorrer el conjunto de resultados obteniendo una fila a la vez.En general, no hay ninguna ventaja particular en hacer esto en comparación con el uso del iterador.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()

Otros consejos

Mi forma preferida es el iterador del cursor, pero estableciendo primero la propiedad tamaño de matriz del cursor.

curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
    print row

En este ejemplo, cx_Oracle recuperará 256 filas de Oracle a la vez, lo que reducirá la cantidad de viajes de ida y vuelta de la red que deben realizarse.

También está la manera psyco-pg parece hacerlo...Por lo que deduzco, parece crear servidores proxy de fila similares a un diccionario para asignar la búsqueda de claves al bloque de memoria devuelto por la consulta.En ese caso, buscar la respuesta completa y trabajar con una fábrica de proxy similar en las filas parece una idea útil.Ahora que lo pienso, se parece más a Lua que a Python.

Además, esto debería ser aplicable a todos PEP-249 DBAPI2.0 interfaces, no solo Oracle, o te refieres solo lo más rápido usando Oráculo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top