example cx_oracle 12c python sql database oracle cx-oracle

cx_oracle - python oracle 12c



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

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


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 devuelve una sola fila en el conjunto de resultados, puede llamar a 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()


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


También está la forma en que psyco-pg parece hacerlo ... Por lo que veo, parece crear proxies fila-como-diccionario para mapear la búsqueda de teclas 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 ?