para - ¿Cómo funcionan los cursores en la API DB de Python?
insertar datos en mysql con python (3)
He estado usando python con RDBMS ''(MySQL y PostgreSQL), y me he dado cuenta de que realmente no entiendo cómo usar un cursor.
Por lo general, uno tiene su script conectado al DB a través de un cliente DB-API (como psycopg2 o MySQLdb):
connection = psycopg2.connect(host=''otherhost'', etc)
Y luego uno crea un cursor:
cursor = connection.cursor()
Y luego uno puede emitir consultas y comandos:
cursor.execute("SELECT * FROM etc")
Ahora, ¿dónde está el resultado de la consulta, me pregunto? ¿está en el servidor? o un poco sobre mi cliente y un poco sobre mi servidor? Y luego, si necesitamos acceder a algunos resultados, los buscamos:
rows = cursor.fetchone()
o
rows = cursor.fetchmany()
Ahora digamos, no recupero todas las filas y decido ejecutar otra consulta, ¿qué pasará con los resultados anteriores? Es su una sobrecarga.
Además, debería crear un cursor para cada forma de comando y reutilizarlo continuamente para esos mismos comandos de alguna manera; Dirijo psycopg2 de alguna manera puede optimizar los comandos que se ejecutan muchas veces, pero con diferentes valores, ¿cómo y lo vale?
Gracias
ya, sé que tiene meses: P
El cursor de DB-API parece estar modelado de cerca después de los cursores de SQL. La administración de los recursos de AFA (filas) se refiere, DB-API no especifica si el cliente debe recuperar todas las filas o DECLARAR un cursor de SQL real . Siempre que las interfaces fetchXXX hagan lo que se supone que deben, DB-API está contenta.
Los cursores de AFC psycopg2 están preocupados (como bien sabrá), los "cursores DB-API sin nombre" buscarán el conjunto de resultados completo - AFAIK almacenado en la memoria mediante libpq. los "cursores denominados DB-API" (un concepto de psycopg2 que puede no ser portátil), solicitarán las filas bajo demanda (métodos fetchXXX).
Como se cita por "desconocido", executemany se puede usar para optimizar varias ejecuciones del mismo comando. Sin embargo, no se adapta a la necesidad de declaraciones preparadas; cuando las ejecuciones repetidas de una instrucción con diferentes conjuntos de parámetros no son directamente secuenciales, executemany () funcionará tan bien como execute (). DB-API "proporciona" a los autores de controladores la capacidad de almacenar en caché las sentencias ejecutadas, pero su implementación (¿cuál es el alcance / duración de la declaración?) No está definida, por lo que es imposible establecer expectativas en las implementaciones DB-API.
Si está cargando muchos datos en PostgreSQL, le recomiendo tratar de encontrar una manera de usar COPY.
Cuando mira aquí la documentación de mysqldb , puede ver que implementaron diferentes estrategias para los cursores. Entonces la respuesta general es: depende.
Editar: Aquí está la documentación de la API mysqldb . Hay alguna información sobre cómo se comporta cada tipo de cursor. El cursor estándar almacena el conjunto de resultados en el cliente. Así que supongo que hay una sobrecarga si no recuperas todas las filas de resultados, porque incluso las filas que no recuperas deben transferirse al cliente (posiblemente a través de la red). Mi suposición es que no es tan diferente de postgresql.
Cuando desee optimizar declaraciones de SQL a las que llame repetidamente con muchos valores, debe ver cursor.executemany (). Prepara una declaración SQL para que no sea necesario analizarla cada vez que la llame:
cur.executemany(''INSERT INTO mytable (col1, col2) VALUES (%s, %s)'',
[(''val1'', 1), (''val2'', 2)])
Suponiendo que está utilizando PostgreSQL, los cursores probablemente solo se implementen usando la API de cursor nativa de la base de datos. Es posible que desee ver el código fuente de pg8000 , un módulo puro de Python PostgreSQL DB-API, para ver cómo maneja los cursores. También puede consultar la documentación de PostgreSQL para cursores .