Pourquoi avez-vous besoin pour créer un curseur lors de l'interrogation d'une base de données sqlite?
Je suis complètement nouveau pour Python module sqlite3 (et SQL en général d'ailleurs), et ce juste complètement souches moi. L'abondance de l'absence de descriptions de cursor
objets (plutôt, de leur nécessité) semble également étrange.
Cet extrait de code est la meilleure façon de faire les choses:
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()
Ce n'est pas le cas, même si cela fonctionne tout aussi bien et sans (apparemment inutiles) cursor
:
import sqlite3
conn = sqlite3.connect("db.sqlite")
conn.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()
Quelqu'un peut me dire pourquoi j'ai besoin d'un cursor
?
Il semble juste comme inutile frais généraux. Pour chaque méthode dans mon script qui accède à une base de données, je suis censé créer et de détruire un cursor
?
Pourquoi ne pas simplement utiliser le connection
objet?
Vous devez vous connecter pour publier un commentaire.
Juste fait une application erronée de l'abstraction, il me semble. Un db cursor est une abstraction, pour l'ensemble de données de la traversée.
De Article de wikipédia sur le sujet:
Et:
Si vous cochez la docs sur Python module sqlite, vous pouvez voir qu'un module python
cursor
est nécessaire, même pour unCREATE TABLE
déclaration, il est donc utilisé dans les cas où une simpleconnection
objet devrait suffire - comme souligné à juste titre par les OP. Une telle abstraction est différent de ce que les gens comprennent un db curseur à l'être et, par conséquent, la confusion/frustration de la part des utilisateurs. Indépendamment de l'efficacité, c'est juste un conceptuels généraux. Ce serait bien si il a été souligné dans les docs que le module pythoncursor
est un peu différent que ce que le curseur est dans SQL et des bases de données.Vous avez besoin d'un curseur de l'objet à extraire les résultats. Ton exemple fonctionne parce qu'il est un
INSERT
et donc vous n'êtes pas en essayant d'obtenir les lignes de retour, mais si vous regardez lasqlite3
docs, vous remarquerez qu'il n'y a pas.fetchXXXX
méthodes sur les objets de connexion, donc si vous avez essayé de faire unSELECT
sans un curseur, vous n'auriez aucun moyen d'obtenir les données qui en résultent.Curseur objets vous permettent de garder la trace de l'ensemble de résultats est qui, puisqu'il est possible d'exécuter plusieurs requêtes avant que vous avez terminé de récupérer les résultats de la première.
execute
sur un objet de connexion, c'est unsqlite3
extension.Selon le rapport officiel docs
connection.execute()
est un non standard raccourci qui crée un intermédiaire curseur de l'objet:(sqlite3 documentation; c'est moi qui souligne.)
Car ces méthodes de l'objet de connexion sont non standard, c'est à dire qu'ils ne font pas partie de Python Base de données de Spécification de l'API v2.0 (PEP 249).
Aussi longtemps que vous utilisez les méthodes standard de l'objet Curseur, vous pouvez être sûr que si vous passez à une autre base de données de mise en œuvre qui suit les spécifications ci-dessus, votre code sera entièrement portable. Peut-être que vous aurez seulement besoin de changer le
import
ligne.Mais si vous utilisez la
connection.execute
il y a une chance que le changement ne sera pas que simple. C'est la raison principale pour laquelle vous souhaitez utilisercursor.execute
à la place.Toutefois, si vous êtes certain que vous n'allez pas passer, je dirais que c'est complètement OK pour prendre la
connection.execute
raccourci et être "efficace".Il nous donne la possibilité d'avoir de multiples distincts des environnements de travail par le biais de la même connexion à la base de données.