Soy completamente nuevo en el módulo sqlite3 de Python (y SQL en general para el caso), y esto me sorprende por completo. La abundante falta de descripciones de los cursorobjetos (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 lo es, a pesar de que funciona igual de bien y sin el (aparentemente inútil) cursor:
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 solo usar el connectionobjeto?

Necesita un objeto de cursor para obtener resultados. Su ejemplo funciona porque es un
INSERTy, por lo tanto, no está tratando de recuperar filas, pero si mira lossqlite3documentos , notará que no hay ningún.fetchXXXXmétodo en los objetos de conexión, por lo que si intentó hacerlo unaSELECTsin un cursor, tendría ninguna manera de obtener los datos resultantes.Los objetos de cursor le permiten realizar un seguimiento de qué conjunto de resultados es cuál, ya que es posible ejecutar múltiples consultas antes de que termine de buscar los resultados de la primera.
fuente
executeen un objeto de conexión, esta es unasqlite3extensión.Según los documentos oficiales, se
connection.execute()trata de un acceso directo no estándar que crea un objeto de cursor intermedio:fuente
( documentación de sqlite3 ; énfasis mío.)
Debido a que esos métodos del objeto de conexión no son estándar , es decir, no forman parte de la especificación de API Python Database v2.0 (PEP 249).
Siempre que utilice los métodos estándar del objeto Cursor, puede estar seguro de que si cambia a otra implementación de base de datos que siga la especificación anterior, su código será totalmente portátil. Quizás solo necesite cambiar la
importlínea.Pero si usa el,
connection.executeexiste la posibilidad de que el cambio no sea tan sencillo. Esa es la razón principal por la que quizás quieras usarcursor.executeen su lugar.Sin embargo, si está seguro de que no va a cambiar, diría que está completamente bien tomar el
connection.executeatajo y ser "eficiente".fuente
Nos da la capacidad de tener múltiples entornos de trabajo separados a través de la misma conexión a la base de datos.
fuente