Der Autor hat den COVID-19-Hilfsfonds ausgewählt, um eine Spende im Rahmen des Write for DOnations-Programms zu erhalten.
Einführung
SQLite ist eine eigenständige, dateibasierte SQL-Datenbank. SQLite wird mit Python geliefert und kann in jeder Ihrer Python-Anwendungen verwendet werden, ohne zusätzliche Software installieren zu müssen.
In diesem Tutorial gehen wir das Modul sqlite3
in Python 3 durch., Wir erstellen eine Verbindung zu einer SQLite-Datenbank, fügen dieser Datenbank eine Tabelle hinzu, fügen Daten in diese Tabelle ein und lesen und ändern Daten in dieser Tabelle.
Für dieses Tutorial arbeiten wir in erster Linie mit einem Inventar von Fischen, die wir ändern müssen, wenn Fische zu einem fiktiven Aquarium hinzugefügt oder daraus entfernt werden.
Voraussetzungen
Um das Beste aus diesem Tutorial herauszuholen, wird empfohlen, sich mit der Programmierung in Python und einigen grundlegenden Hintergrundinformationen mit SQL vertraut zu machen.,
Sie können diese Tutorials für die notwendigen Hintergrundinformationen überprüfen:
- Wie in Python3 Code
- Eine Einführung in Abfragen in MySQL
Schritt 1 — Erstellen einer Verbindung zu einer SQLite-Datenbank
Wenn wir eine Verbindung zu einer SQLite-Datenbank herstellen, greifen wir auf Daten zu, die sich letztendlich in einer Datei auf unserem Computer befinden. SQLite-Datenbanken sind voll funktionsfähige SQL-Engines, die für viele Zwecke verwendet werden können. Im Moment betrachten wir eine Datenbank, die das Inventar von Fischen in einem fiktiven Aquarium verfolgt.,
Wir können eine Verbindung zu einer SQLite-Datenbank herstellen, indem wir das Modul Python sqlite3
verwenden:
import sqlite3connection = sqlite3.connect("aquarium.db")
import sqlite3
gibt unserem Python-Programm Zugriff auf das Modul sqlite3
. Die Funktion gibt ein Connection
– Objekt zurück, mit dem wir mit der SQLite-Datenbank interagieren, die sich in der Datei befindet aquarium.db
. Dieaquarium.db
– Datei wird automatisch von erstellt, wennaquarium.db
auf unserem Computer noch nicht vorhanden ist.,
Wir können überprüfen, ob wir unser connection
– Objekt erfolgreich erstellt haben, indem wir Folgendes ausführen:
print(connection.total_changes)
Wenn wir diesen Python-Code ausführen, sehen wir eine Ausgabe wie:
Output0
connection.total_changes
ist die Gesamtzahl der Datenbankzeilen, die von connection.total_changes
. Da wir noch keine SQL-Befehle ausgeführt haben, ist 0 total_changes
korrekt.
Wenn wir zu irgendeinem Zeitpunkt feststellen, dass wir dieses Tutorial erneut starten möchten, können wir die aquarium.db
– Datei von unserem Computer löschen.,
Hinweis: Es ist auch möglich, eine Verbindung zu einer SQLite-Datenbank herzustellen, die sich ausschließlich im Speicher (und nicht in einer Datei) befindet, indem die spezielle Zeichenfolge an übergeben wird. Zum Beispiel sqlite3.connect(":memory:")
. Eine SQLite-Datenbank verschwindet, sobald Ihr Python-Programm beendet wird. Dies ist möglicherweise praktisch, wenn Sie möchten, dass eine temporäre Sandbox etwas in SQLite ausprobiert und keine Daten nach dem Beenden Ihres Programms beibehalten muss.,
Schritt 2-Hinzufügen von Daten zur SQLite-Datenbank
Nachdem wir nun eine Verbindung zur SQLite-Datenbank aquarium.db
hergestellt haben, können wir damit beginnen, Daten einzufügen und daraus zu lesen.
In einer SQL-Datenbank werden Daten in Tabellen gespeichert. Tabellen definieren einen Satz von Spalten und enthalten 0 oder mehr Zeilen mit Daten für jede der definierten Spalten., eine Tabelle mit dem Namen fish
, die die folgenden Daten verfolgt:
name | spezies | tank_number |
---|---|---|
Sammy | shark | 1 |
Jamie | tintenfisch | 7 |
Die fish
Tabelle wird eine wert für name
, species
und tank_number
für jeden Fisch im Aquarium., Two example fish
rows are listed: one row for a shark
named Sammy
, and one row for a cuttlefish
named Jamie
.
We can create this fish
table in SQLite using the connection
we made in Step 1:
cursor = connection.cursor()cursor.execute("CREATE TABLE fish (name TEXT, species TEXT, tank_number INTEGER)")
connection.cursor()
returns a Cursor
object. Cursor
objects allow us to send SQL statements to a SQLite database using cursor.execute()
., Die "CREATE TABLE fish ..."
– Zeichenfolge ist eine SQL-Anweisung, die eine Tabelle mit dem Namen fish
mit den zuvor beschriebenen drei Spalten erstellt: name
vom Typ TEXT
, Spezies vom Typ TEXT
und tank_number
vom Typ INTEGER
.,
Nachdem wir nun eine Tabelle erstellt haben, können wir Datenzeilen einfügen:
cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)")cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")
Wir rufen cursor.execute()
zweimal auf: einmal, um eine Zeile für den Shark einzufügen Sammy
in tank 1
und einmal, um eine Zeile für den shark tintenfische Jamie
im Tank 7
. "INSERT INTO fish VALUES ..."
ist eine SQL-Anweisung, mit der wir einer Tabelle Zeilen hinzufügen können.,
Im nächsten Abschnitt verwenden wir eine SQL SELECT
– Anweisung, um die Zeilen zu überprüfen, die wir gerade in unsere fish
– Tabelle eingefügt haben.
Schritt 3-Lesen von Daten aus der SQLite-Datenbank
In Schritt 2 haben wir einer SQLite-Tabelle mit dem Namen fish
zwei Zeilen hinzugefügt., Wir können diese Zeilen mit einer SELECT
SQL-Anweisung abrufen:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Wenn wir diesen Code ausführen, wird die Ausgabe wie folgt angezeigt:
Output
Die Funktion cursor.execute()
führt eine SELECT
– Anweisung zum Abrufen von Werten für die Spalten name
, species
und tank_number
in der Tabelle fish
. fetchall()
ruft alle Ergebnisse der SELECT
– Anweisung ab., Wenn wir print(rows)
sehen wir eine Liste von zwei-Tupeln. Jedes Tupel hat drei Einträge; Ein Eintrag für jede Spalte, die wir aus der Tabelle fish
ausgewählt haben. Die beiden Tupel enthalten die Daten, die wir in Schritt 2 eingefügt haben: ein Tupel für Sammy
die shark
und ein Tupel für Jamie
die cuttlefish
.,
Wenn wir Zeilen in der fish
– Tabelle abrufen möchten, die einem bestimmten Kriteriensatz entsprechen, können wir eine WHERE
– Klausel verwenden:
Wenn wir dies ausführen, wird die Ausgabe wie folgt angezeigt:
Output
Wie im vorherigen Beispiel wird cursor.execute(<SQL statement>).fetchall()
ermöglicht es uns, alle Ergebnisse einer SELECT
– Anweisung abzurufen. DieWHERE
Klausel in derSELECT
Anweisung filtert für Zeilen, in denen der Wert vonname
target_fish_name
., Beachten Sie, dass wir verwenden, um unsere target_fish_name
Variable in die SELECT
Anweisung zu ersetzen. Wir erwarten, dass nur eine Zeile übereinstimmt, und tatsächlich wird nur die Zeile für Jamie
cuttlefish
zurückgegeben.
Warnung: Verwenden Sie niemals Python-Zeichenfolgenoperationen, um dynamisch eine SQL-Anweisungszeichenfolge zu erstellen. Durch die Verwendung von Python-Zeichenfolgenoperationen zum Zusammenstellen einer SQL-Anweisungszeichenfolge sind Sie anfällig für SQL-Injection-Angriffe. SQL Injection-Angriffe können verwendet werden, um in Ihrer Datenbank gespeicherte Daten zu stehlen, zu ändern oder anderweitig zu ändern., Verwenden Sie immer den Platzhalter in Ihren SQL-Anweisungen, um Werte aus Ihrem Python-Programm dynamisch zu ersetzen. Übergeben Sie ein Tupel von Werten als zweites Argument an Cursor.execute()
, um Ihre Werte an die SQL-Anweisung zu binden. Dieses Substitutionsmuster wird hier und auch in anderen Teilen dieses Tutorials demonstriert.
Schritt 4-Ändern von Daten in der SQLite-Datenbank
Zeilen in einer SQLite-Datenbank können mit UPDATE
und DELETE
SQL-Anweisungen geändert werden.,
Nehmen wir zum Beispiel an, dass Sammy, der Hai, auf Tank Nummer 2 verschoben wurde. Wir können Sammys Zeile in der Tabelle fish
ändern, um diese Änderung widerzuspiegeln:
Wir geben eine UPDATE
SQL-Anweisung aus, um die tank_number
von Sammy
in den neuen Wert von 2
zu ändern. DieWHERE
– Klausel in derUPDATE
– Anweisung stellt sicher, dass wir den Wert vontank_number
nur ändern, wenn eine Zeilename = "Sammy"
.,
Wenn wir die folgende SELECT
Anweisung ausführen, können wir bestätigen, dass unser Update korrekt durchgeführt wurde:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Wenn wir dies ausführen, sehen wir die Ausgabe wie folgt:
Output
Beachten Sie, dass die Zeile für Sammy
jetzt hat den Wert von 2
für seine tank_number
Spalte.
Angenommen, Sammy, der Hai, wurde in die Wildnis entlassen und nicht mehr vom Aquarium gehalten., Da Sammy nicht mehr im Aquarium lebt, wäre es sinnvoll, die Zeile Sammy
aus der Tabelle fish
zu entfernen.
Geben Sie eine DELETE
SQL-Anweisung aus, um eine Zeile zu entfernen:
released_fish_name = "Sammy"cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,))
Wir geben eine DELETE
SQL-Anweisung aus, um die Zeile für Sammy
zu entfernen shark
. DieWHERE
– Klausel in derDELETE
– Anweisung stellt sicher, dass wir eine Zeile nur löschen, wenn diese Zeilename = "Sammy"
.,
Wenn wir die folgende SELECT
Anweisung ausführen, können wir bestätigen, dass unsere Löschung korrekt vorgenommen wurde:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall()print(rows)
Wenn wir diesen Code ausführen, sehen wir die Ausgabe wie folgt:
Output
Beachten Sie, dass die Zeile für Sammy
die shark
ist jetzt weg, und nur Jamie
die cuttlefish
bleibt erhalten.,
Schritt 5 — Verwenden mit Anweisungen für die automatische Bereinigung
In diesem Tutorial haben wir zwei primäre Objekte verwendet, um mit der "aquarium.db"
SQLite-Datenbank zu interagieren: a Connection
Objekt mit dem Namen connection
und a Cursor
Objekt mit dem Namen cursor
.
Auf die gleiche Weise, wie Python-Dateien geschlossen werden sollten, wenn wir mit ihnen fertig sind, sollten Connection
und Cursor
Objekte auch geschlossen werden, wenn sie nicht mehr benötigt werden.,
Mit einer with
– Anweisung können wir Connection
und Cursor
– Objekte automatisch schließen:
closing
ist eine Komfortfunktion, die vom contextlib
– Modul bereitgestellt wird. Wenn einewith
Anweisung beendet wird, stelltclosing
sicher, dass für jedes Objekt aufgerufen wird, das an sie übergeben wird. Die Funktion closing
wird in diesem Beispiel zweimal verwendet., Einmal, um sicherzustellen, dass das von Connection
zurückgegebene Objekt automatisch geschlossen wird, und ein zweites Mal, um sicherzustellen, dass das von Cursor
zurückgegebene Objekt connection.cursor()
automatisch geschlossen wird.,
Wenn wir diesen Code ausführen, sehen wir die Ausgabe wie folgt:
Output
Da "SELECT 1"
eine SQL-Anweisung ist, die immer eine einzelne Zeile mit einer einzelnen Spalte mit dem Wert 1
zurückgibt, ist es sinnvoll, ein einzelnes Tupel mit 1
Das Modul sqlite3
ist ein leistungsfähiger Bestandteil der Python-Standardbibliothek; Es ermöglicht uns, mit einer voll funktionsfähigen SQL-Datenbank auf der Festplatte zu arbeiten, ohne zusätzliche Software zu installieren.,
In diesem Tutorial haben wir gelernt, wie Sie das Modul sqlite3
verwenden, um eine Verbindung zu einer SQLite-Datenbank herzustellen, Daten zu dieser Datenbank hinzuzufügen sowie Daten in dieser Datenbank zu lesen und zu ändern. Unterwegs lernten wir auch die Risiken von SQL-Injection-Angriffen kennen und wie man contextlib.closing
verwendet, um für Python-Objekte in with
– Anweisungen automatisch aufzurufen.
Von hier aus können wir mehr über SQL-Datenbanken in SQLite vs MySQL vs PostgreSQL erfahren: Ein Vergleich relationaler Datenbankverwaltungssysteme.