CX_ORACE: ¿Cómo lo hago en un conjunto de resultados? -- python campo con sql campo con database campo con oracle campo con cx-oracle camp Relacionados El problema

cx_Oracle: How do I iterate over a result set?


50
vote

problema

Español

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

Original en ingles

There are several ways to iterate over a result set. What are the tradeoff of each?

</div
              
 
 

Lista de respuestas

50
 
vote
vote
La mejor respuesta
 

La forma canónica es usar el iterador del 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 los conjuntos de resultados más pequeños, pero puede tener efectos secundarios malos si el conjunto de resultados es grande.

  • Tienes que esperar a que se devuelva el conjunto de resultados. su proceso de cliente.

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

  • Puede tomar un tiempo para que Python construya y deconstruya el Lista que va a descartar inmediatamente de todos modos.


Si sabe que hay una sola fila que se devuelve 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 hacer una vuelta sobre el conjunto de resultados para obtener una fila a la vez. En general, no hay una ventaja particular para hacer esto sobre el uso del iterador.

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

The canonical way is to use the built-in cursor iterator.

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

You can use fetchall() to get all rows at once.

for row in curs.fetchall():     print row 

It can be convenient to use this to create a Python list containing the values returned:

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

This can be useful for smaller result sets, but can have bad side effects if the result set is large.

  • You have to wait for the entire result set to be returned to your client process.

  • You may eat up a lot of memory in your client to hold the built-up list.

  • It may take a while for Python to construct and deconstruct the list which you are going to immediately discard anyways.


If you know there's a single row being returned in the result set you can call fetchone() to get the single row.

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

Finally, you can loop over the result set fetching one row at a time. In general, there's no particular advantage in doing this over using the iterator.

row = curs.fetchone() while row:     print row     row = curs.fetchone() 
</div
 
 
   
   
25
 
vote

Mi forma preferida es el iterador del cursor, pero configure primero la propiedad arraysize del cursor.

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

En este ejemplo, CX_ORACLE obtendrá filas de filas de Oracle 256 a la vez, reduciendo el número de viajes de red redondos que deben realizarse

 

My preferred way is the cursor iterator, but setting first the arraysize property of the cursor.

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

In this example, cx_Oracle will fetch rows from Oracle 256 rows at a time, reducing the number of network round trips that need to be performed

</div
 
 
       
       
6
 
vote

También está la forma en que psyco-pg parece hacerlo ... Desde lo que me reúnan, parece crear proxies de filas como un diccionario para mapear la búsqueda de la tecla en el bloque de memoria devuelto por la consulta. En ese caso, recuperar toda la respuesta y trabajar con una fábrica proxy similar sobre las filas parece una idea útil. Sin embargo, viene a pensarlo, se siente más como Lua que Python.

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

 

There's also the way psyco-pg seems to do it... From what I gather, it seems to create dictionary-like row-proxies to map key lookup into the memory block returned by the query. In that case, fetching the whole answer and working with a similar proxy-factory over the rows seems like useful idea. Come to think of it though, it feels more like Lua than Python.

Also, this should be applicable to all PEP-249 DBAPI2.0 interfaces, not just Oracle, or did you mean just fastest using Oracle?

</div
 
 

Relacionados problema

0  Solicitud de Python tratando de insertar en Oracle  ( Python application trying to insert into oracle ) 
Tengo una aplicación simple de Tkinter, construí para poner en la cantidad de horas que trabajé. Por alguna razón, sigo recibiendo este error "BatherError: OR...

1  Sqlalchemy + cx_oracle y caracteres especiales  ( Sqlalchemy cx oracle and special characters ) 
Estoy intentando conectarme a un DB Oracle con SQLALCHEMMY: import sqlalchemy oracle_db = sqlalchemy.create_engine('oracle+cx_oracle://user:passwd@host:po...

0  Cifrar las contraseñas de la base de datos de Oracle utilizando Python  ( Encrypt oracle database passwords using python ) 
Entonces, lo que tenemos es algunos procesos que inician sesión en las bases de datos y debemos tener las credenciales para eso encriptadas (al menos la contr...

3  Llame a Oracle Procedimiento almacenado con el parámetro de salida del cursor de Python Script  ( Call oracle stored procedure with cursor output parameter from python script ) 
Estoy tratando de llamar a un procedimiento almacenado Oracle con 2 en y 1 parámetro de salida de Python Script. El problema que estoy teniendo es pasar un pa...

5  Cómo instalar / usar CX_ORACLE en PYPY  ( How to install use cx oracle in pypy ) 
Parece que no puedo encontrar nada en Google o así con información sobre cómo obtener CX_ORACE para trabajar con PyPy. ¿Alguien puede decirme si es posible, y...

4  Gestión de la memoria de grandes datos de la base de datos de Oracle  ( Memory management of large data from oracle database ) 
Estoy sacando datos grandes de la base de datos de Oracle usando CX_ORACLE usando el script de muestra a continuación: from cx_Oracle import connect TABLE...

50  CX_ORACE: ¿Cómo lo hago en un conjunto de resultados?  ( Cx oracle how do i iterate over a result set ) 
Hay varias formas de iterar sobre un conjunto de resultados. ¿Cuál es la compensación de cada uno? ...

0  Python: Conexión a una base de datos Oracle con Wallet / TNSNames de Oracle  ( Python connecting to an oracle database using oracles wallet tnsnames ) 
para que pueda conectarme a una base de datos Oracle como tal: import cx_Oracle as ora dsnStr = ora.makedsn(host="ABC.COM", port="ABC_PORT", sid="ABC") con...

3  Cierre de una conexión CX_ORACE al tiempo que permite una base de datos hacia abajo  ( Closing a cx oracle connection while allowing for a down database ) 
El siguiente código gradlew010 funciona bien cuando la base de datos está arriba: gradlew111 Pero si la base de datos se está reduciendo cuando ejecut...

0  CX_ORACLE QUERY JSON CLOB CON 'LIKE'  ( Cx oracle query json clob with like ) 
Estoy explorando las características JSON de CX_ORACLE dentro de un clob. Tengo un índice en la tabla que me permite consultar la igualdad directa KeyParam...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos