Ich bin völlig neu in Pythons sqlite3-Modul (und SQL im Allgemeinen), und das macht mich einfach total fertig. Das reichlich vorhandene Fehlen von Beschreibungen von cursor
Objekten (eher deren Notwendigkeit) scheint ebenfalls seltsam.
Dieser Codeausschnitt ist die bevorzugte Methode, um Dinge zu tun:
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()
Dies ist nicht der Fall, obwohl es genauso gut und ohne das (scheinbar sinnlose) funktioniert cursor
:
import sqlite3
conn = sqlite3.connect("db.sqlite")
conn.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()
Kann mir jemand sagen, warum ich eine brauche cursor
?
Es scheint nur sinnlos über Kopf. Für jede Methode in meinem Skript, die auf eine Datenbank zugreift, soll ich ein cursor
? Erstellen und zerstören .
Warum nicht einfach das connection
Objekt benutzen ?
Sie benötigen ein Cursorobjekt, um Ergebnisse abzurufen. Ihr Beispiel funktioniert, weil es ein ist
INSERT
und Sie daher nicht versuchen, Zeilen daraus zurückzugewinnen. Wenn Sie sich jedoch diesqlite3
Dokumente ansehen , werden Sie feststellen, dass es keine.fetchXXXX
Methoden für Verbindungsobjekte gibt. Wenn Sie dies also versucht haben aSELECT
Ohne Cursor haben Sie keine Möglichkeit, die resultierenden Daten abzurufen.Mit Cursorobjekten können Sie verfolgen, welche Ergebnismenge welche ist, da mehrere Abfragen ausgeführt werden können, bevor Sie die Ergebnisse der ersten abrufen.
quelle
execute
kein Verbindungsobjekt, dies ist einesqlite3
Erweiterung.Laut den offiziellen Dokumenten
connection.execute()
handelt es sich um eine nicht standardmäßige Verknüpfung , die ein Zwischencursorobjekt erstellt:quelle
( SQLite3-Dokumentation ; Schwerpunkt Mine.)
Da diese Methoden des Verbindungsobjekts nicht dem Standard entsprechen , dh nicht Teil der Python Database API Specification v2.0 (PEP 249) sind.
Solange Sie die Standardmethoden des Cursor-Objekts verwenden, können Sie sicher sein, dass Ihr Code vollständig portierbar ist, wenn Sie zu einer anderen Datenbankimplementierung wechseln, die der obigen Spezifikation folgt. Vielleicht müssen Sie nur die
import
Zeile ändern .Wenn Sie das verwenden, besteht jedoch die
connection.execute
Möglichkeit, dass das Umschalten nicht so einfach ist. Dies ist der Hauptgrund, warum Siecursor.execute
stattdessen verwenden möchten .Wenn Sie jedoch sicher sind, dass Sie nicht wechseln werden, würde ich sagen, dass es völlig in Ordnung ist, die
connection.execute
Verknüpfung zu verwenden und "effizient" zu sein.quelle
Es gibt uns die Möglichkeit, mehrere separate Arbeitsumgebungen über dieselbe Verbindung zur Datenbank zu haben.
quelle