Eu sou completamente novo no módulo sqlite3 do Python (e SQL em geral), e isso me surpreende completamente. A abundante falta de descrições de cursor
objetos (antes, sua necessidade) também parece estranha.
Esse trecho de código é a maneira preferida de fazer as coisas:
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 não é, mesmo que funcione tão bem e sem o (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()
Alguém pode me dizer por que eu preciso de um cursor
?
Parece sobrecarga inútil. Para cada método no meu script que acessa um banco de dados, devo criar e destruir um cursor
?
Por que não usar apenas o connection
objeto?
Você precisa de um objeto cursor para buscar resultados. Seu exemplo funciona porque é um
INSERT
e, portanto, você não está tentando recuperar nenhuma linha, mas se você olhar para ossqlite3
documentos , perceberá que não existem.fetchXXXX
métodos nos objetos de conexão; portanto, se você tentou fazer isso umSELECT
sem um cursor, você não teria nenhuma maneira de obter os dados resultantes.Os objetos de cursor permitem que você acompanhe qual conjunto de resultados é qual, já que é possível executar várias consultas antes de concluir a busca dos resultados da primeira.
fonte
execute
em um objeto de conexão, esta é umasqlite3
extensão.De acordo com a documentação oficial,
connection.execute()
é um atalho não padrão que cria um objeto intermediário de cursor:fonte
( documentação do sqlite3 ; ênfase minha.)
Como esses métodos do objeto de conexão não são padrão , ou seja, eles não fazem parte do Python Database API Specification v2.0 (PEP 249).
Desde que você use os métodos padrão do objeto Cursor, pode ter certeza de que, se mudar para outra implementação de banco de dados que segue a especificação acima, seu código será totalmente portátil. Talvez você só precise alterar a
import
linha.Mas se você usar,
connection.execute
há uma chance de que a troca não seja tão simples. Essa é a principal razão pela qual você pode querer usarcursor.execute
.No entanto, se você tiver certeza de que não vai mudar, eu diria que não há problema em
connection.execute
usar o atalho e ser "eficiente".fonte
Isso nos permite ter vários ambientes de trabalho separados pela mesma conexão com o banco de dados.
fonte