Aquí podría ser tu PUBLICIDAD


cx_Oracle: ¿Cómo puedo iterar sobre un conjunto de resultados?

votos
35

Hay varias formas de iterar sobre un conjunto de resultados. ¿Cuál es la compensación de cada uno?

Publicado el 03/08/2008 a las 02:15
fuente por usuario Mark Harrison
En otros idiomas...        العربية       

3 respuestas

votos
35

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

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

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

for row in curs.fetchall():
    print row

Puede ser conveniente usar 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 ser ú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 se devuelva el conjunto de resultados completo a su proceso de cliente.

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

  • Puede tomar un tiempo para que Python construya y deconstruya la lista que de todos modos descartarás de inmediato.


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

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

Finalmente, puede recorrer el conjunto de resultados buscando una fila a la vez. En general, no hay una ventaja particular al hacer esto sobre el uso del iterador.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()
Respondida el 03/08/2008 a las 02:17
fuente por usuario Mark Harrison


Aquí podría ser tu PUBLICIDAD


votos
21

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

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

En este ejemplo, cx_Oracle obtendrá filas de Oracle 256 filas a la vez, reduciendo la cantidad de viajes redondos de red que deben realizarse

Respondida el 24/09/2008 a las 03:51
fuente por usuario Aurelio Martin Massoni

votos
4

También existe la manera psyco-pgde hacerlo ... Por lo que veo, parece crear proxies de filas tipo diccionario para mapear la búsqueda de claves en el bloque de memoria devuelto por la consulta. En ese caso, buscar la respuesta completa y trabajar con una proxy-fábrica similar sobre las filas parece una idea útil. Ahora que lo pienso, se siente más como Lua que como Python.

Además, esto debería ser aplicable a todas las interfaces PEP-249 DBAPI2.0 , no solo a Oracle, ¿o simplemente te refieres a Oracle con mayor rapidez ?

Respondida el 24/08/2008 a las 06:28
fuente por usuario Anders Eurenius