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 ?