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 cursor
objetos (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 connection
objeto?
Necesita un objeto de cursor para obtener resultados. Su ejemplo funciona porque es un
INSERT
y, por lo tanto, no está tratando de recuperar filas, pero si mira lossqlite3
documentos , notará que no hay ningún.fetchXXXX
método en los objetos de conexión, por lo que si intentó hacerlo unaSELECT
sin 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
execute
en un objeto de conexión, esta es unasqlite3
extensió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
import
línea.Pero si usa el,
connection.execute
existe la posibilidad de que el cambio no sea tan sencillo. Esa es la razón principal por la que quizás quieras usarcursor.execute
en su lugar.Sin embargo, si está seguro de que no va a cambiar, diría que está completamente bien tomar el
connection.execute
atajo 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