Verwendung des sqlite3-Moduls in Python 3

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:

Output
0

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 fishzwei 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 vonnametarget_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 2zu ä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 als einziger Wert, der von unserem Code zurückgegeben wird.

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Zur Werkzeugleiste springen