194 votes

Pourquoi faut-il créer un curseur lors de l'interrogation d'une base de données sqlite ?

Je suis totalement novice en matière de Module sqlite3 de Python (et SQL en général d'ailleurs), et cela me laisse complètement perplexe. Le manque flagrant de descriptions de cursor objets (plutôt leur nécessité) semble également étrange.

Cet extrait de code est la meilleure façon de procéder :

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()

Celui-ci ne l'est pas, même s'il fonctionne tout aussi bien et sans les (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-il me dire pourquoi j'ai besoin d'un cursor ?
Cela semble être des frais généraux inutiles. Pour chaque méthode de mon script qui accède à une base de données, je suis censé créer et détruire un fichier cursor ?
Pourquoi ne pas utiliser la fonction connection objet ?

89voto

Basel Shishani Points 1532

Il me semble qu'il s'agit simplement d'une abstraction mal appliquée. Un curseur de base de données est une abstraction destinée à parcourir des ensembles de données.

En Article de Wikipédia sur le sujet :

En informatique et en technologie, un curseur de base de données est un contrôle de contrôle qui permet de parcourir les enregistrements d'une base de données. Les curseurs facilitent le traitement ultérieur en conjonction avec la traitement, tels que la récupération, l'ajout et la suppression d'enregistrements de la base de données. de la base de données. La caractéristique du curseur de la base de données, qui permet de parcourir les enregistrements, fait que les curseurs s'apparentent au concept d'itérateur du langage de programmation.

Et.. :

Les curseurs peuvent être utilisés non seulement pour extraire des données du SGBD dans une application, mais aussi pour les transférer à d'autres applications. l'application, mais aussi pour identifier une ligne d'une table à mettre à jour ou à supprimer. à mettre à jour ou à supprimer. La norme SQL:2003 définit la mise à jour positionnée et la et de suppression positionnées à cette fin. Ces instructions Ces instructions n'utilisent pas de clause WHERE ordinaire avec des prédicats. Au lieu de cela, un curseur identifie la ligne. Le curseur doit être ouvert sur une ligne au moyen de l'instruction FETCH.

Si vous vérifiez le docs sur le module sqlite de Python vous pouvez voir qu'un module python cursor est nécessaire même pour un CREATE TABLE Elle est donc utilisée dans les cas où un simple connection devrait suffire, comme le souligne à juste titre l'OP. Une telle abstraction est différente de ce que les gens comprennent comme étant un curseur de base de données, d'où la confusion et la frustration des utilisateurs. Indépendamment de l'efficacité, il s'agit simplement d'une surcharge conceptuelle. Il serait bon de préciser dans la documentation que le module python cursor est un peu différent de ce qu'est un curseur en SQL et dans les bases de données.

64voto

buffer Points 2261

D'après le document officiel documents connection.execute() est un raccourci non standard qui crée un objet curseur intermédiaire :

Connexion.exécuter
Il s'agit d'un raccourci non standard qui crée un objet curseur en appelant la méthode cursor(), appelle la méthode execute() du curseur avec les paramètres donnés et renvoie le curseur.

52voto

irdb Points 11

12.6.8. Utilisation de sqlite3 efficace ly

12.6.8.1. L'utilisation de raccourci méthodes

L'utilisation de la non standard execute() , executemany() y executescript() de l'objet Connection, votre code peut s'écrire plus concis l'utilisation de l'outil, car vous n'avez pas besoin de créer l'outil (souvent). superflu ) Les objets du curseur de manière explicite. Au lieu de cela, les objets curseurs sont créés implicitement et ces méthodes de raccourci renvoient les objets curseurs. De cette façon, vous pouvez exécuter une instruction SELECT et l'itérer directement en utilisant un seul appel à l'objet Connection.

( documentation sqlite3 (souligné par moi).

Pourquoi ne pas utiliser l'objet de connexion ?

Parce que ces méthodes de l'objet de connexion sont non standard c'est-à-dire qu'ils ne font pas partie des Spécification de l'API de base de données Python v2.0 (PEP 249).

Tant que vous utilisez les méthodes standard de l'objet Cursor, vous pouvez être sûr que si vous passez à une autre implémentation de base de données qui suit la spécification ci-dessus, votre code sera entièrement portable. Peut-être n'aurez-vous besoin que de modifier la méthode import ligne.

Mais si vous utilisez le connection.execute il est possible que le changement ne soit pas aussi simple. C'est la principale raison pour laquelle vous pouvez utiliser la fonction cursor.execute au lieu de cela.

Toutefois, si vous êtes certain que vous n'allez pas changer de fournisseur, je dirais qu'il n'y a pas de problème à prendre le connection.execute raccourci et d'être "efficace".

51voto

Amber Points 159296

Vous avez besoin d'un objet curseur pour récupérer les résultats. Votre exemple fonctionne parce qu'il s'agit d'un objet INSERT et donc vous n'essayez pas de récupérer des rangs, mais si vous regardez le fichier sqlite3 documents vous remarquerez qu'il n'y a pas de .fetchXXXX sur les objets de connexion, donc si vous essayez de faire un SELECT sans curseur, vous n'auriez aucun moyen d'obtenir les données résultantes.

Les objets curseurs vous permettent de savoir quel est l'ensemble de résultats, puisqu'il est possible d'exécuter plusieurs requêtes avant d'avoir fini de récupérer les résultats de la première.

4voto

Python Learner Points 73

Il nous permet d'avoir plusieurs environnements de travail distincts via la même connexion à la base de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X