una ejemplos ejemplo descargar datos crear con python sqlite sqlite3 cursor

ejemplos - python y sqlite3 descargar



¿Por qué necesita crear un cursor al consultar una base de datos sqlite? (4)

12.6.8. Usando sqlite3 eficientemente

12.6.8.1. Usando métodos abreviados

Usando los métodos no estándar execute() , executemany() y executemany() del objeto Connection, su código se puede escribir de manera más concisa porque no tiene que crear los objetos del Cursor (a menudo superfluos ) explícitamente. En cambio, los objetos del Cursor se crean implícitamente y estos métodos abreviados devuelven los objetos del cursor. De esta forma, puede ejecutar una instrucción SELECT e iterar sobre ella directamente utilizando solo una llamada en el objeto Connection.

( documentación de sqlite3 ; énfasis mío)

¿Por qué no usar el objeto de conexión?

Debido a que los métodos del objeto de conexión docs son docs , es decir, no son parte de la Especificación API de la base de datos Python v2.0 (PEP 249).

Siempre que use los métodos estándar del objeto Cursor, puede estar seguro de que si cambia a otra implementación de base de datos que sigue la especificación anterior, su código será totalmente portátil. Tal vez solo necesites cambiar la línea de import .

Pero si usa connection.execute existe la posibilidad de que el cambio no sea tan sencillo. Esa es la razón principal por la que es posible que desee utilizar cursor.execute en cursor.execute lugar.

Sin embargo, si está seguro de que no va a cambiar, diría que está completamente bien tomar el atajo connection.execute y ser "eficiente".

Soy completamente nuevo en el módulo sqlite3 de Python (y SQL en general para el caso), y esto me deja totalmente anonadado. La abundante falta de descripciones de objetos de cursor (más bien, su necesidad) también parece extraña.

Este fragmento de código es la forma preferida de hacer las cosas:

import sqlite3 conn = sqlite3.connect("db.sqlite") c = conn.cursor() c.execute(''''''insert into table "users" values ("Jack Bauer", "555-555-5555")'''''') conn.commit() c.close()

Este no es, aunque funciona igual de bien y sin el cursor (aparentemente sin sentido):

import sqlite3 conn = sqlite3.connect("db.sqlite") conn.execute(''''''insert into table "users" values ("Jack Bauer", "555-555-5555")'''''') conn.commit()

¿Alguien puede decirme por qué necesito un cursor ?
Simplemente parece una sobrecarga inútil. Para cada método en mi script que accede a una base de datos, ¿se supone que debo crear y destruir un cursor ?
¿Por qué no usar el objeto de connection ?


De acuerdo con los docs oficiales, connection.execute() es un acceso directo no estándar que crea un objeto de cursor intermedio.


Necesita un objeto de cursor para obtener resultados. Su ejemplo funciona porque es un INSERT y, por lo tanto, no está intentando recuperar ninguna fila, pero si observa los documentos sqlite3 , verá que no hay ningún método .fetchXXXX en los objetos de conexión, por lo que si Trató de hacer un SELECT sin un cursor, no tendría forma de obtener los datos resultantes.

Los objetos del cursor le permiten realizar un seguimiento de qué conjunto de resultados es el que, dado que es posible ejecutar varias consultas antes de que termine de obtener los resultados de la primera.


Solo una abstracción mal aplicada me parece a mí. Un cursor db es una abstracción, destinada a la travesía del conjunto de datos.

Del artículo de Wikipedia sobre el tema :

En informática y tecnología, un cursor de base de datos es una estructura de control que permite el cruce sobre los registros en una base de datos. Los cursores facilitan el procesamiento posterior junto con el recorrido, como la recuperación, adición y eliminación de registros de la base de datos. La característica del cursor de la base de datos de recorrido hace que los cursores sean similares al concepto del lenguaje de programación del iterador.

Y:

Los cursores no solo se pueden usar para obtener datos del DBMS en una aplicación, sino también para identificar una fila en una tabla que se actualizará o eliminará. El estándar SQL: 2003 define la actualización posicionado y coloca las instrucciones SQL de eliminación para ese propósito. Tales declaraciones no usan una cláusula WHERE regular con predicados. En cambio, un cursor identifica la fila. El cursor debe estar abierto y ya colocado en una fila mediante la instrucción FETCH.

Si comprueba los documentos en el módulo sqlite de Python , puede ver que se necesita un cursor módulo python incluso para una CREATE TABLE , por lo que se utiliza para casos en los que un simple objeto de connection debería ser suficiente, como lo señala correctamente el OP. Tal abstracción es diferente de lo que las personas entienden que es un cursor db y, por lo tanto, la confusión / frustración por parte de los usuarios. Independientemente de la eficiencia, es solo una sobrecarga conceptual. Sería bueno si se señalara en los documentos que el cursor módulo python es un poco diferente de lo que es un cursor en SQL y bases de datos.