Python Tutorial
- jetzt Python programmieren lernen

grundsätzliche Vorgehensweise für Nutzung von Datenbankzugriffen (hier SQLite)

Für die Nutzung von Datenbanken mit Python gibt es eine grundsätzliche Vorgehensweise, die wir in 5 Schritten hier ansehen möchten. Dabei ist für die meisten verfügbaren Datenbanken (im folgenden SQLite) die Vorgehensweise nahezu identisch. Im folgenden Kapitel bauen wir eine Verbindung zur Datenbank auf und führen eine Aktion mit der Datenbank aus (im Beispiel erzeugen wir eine leere Tabelle).

Wir starten mit SQLite, weil es uns gleich mehrere Vorteile bietet (wie in der einführenden Beschreibung erwähnt). Es ist bereits in Python vorhanden und das Modul kann einfach importiert werden. Die Daten selber werden in einer Datei mit der Dateiendung „.db“ gespeichert und können somit problemlos weitergegeben werden.

erster Schritt: SQL-Modul importieren

Als erstes müssen wir unser SQL-Modul importieren:

import sqlite3

Die folgenden 5 Schritte sind für die Interaktion mit Datenbanken meistens notwendig:

  1. Verbindung zur Datenbank herstellen
  2. Cursor-Objekt (zum Zugriff auf die Datenbank)
  3. SQL-Query übergeben
  4. commit: wir bestätigen der Datenbank, dass wir die SQL-Anweisung wirklich ausführen lassen wollen
  5. Schließen der Datenbankverbindung (Ordnung muss sein)

Schritt 1: Unsere Verbindung zur Datenbank aufbauen

Wir wollen nun eine Verbindung zu unserer Datenbank aufbauen. Dazu benötigen wir einen Datenbanknamen, auf den wir dann über eine Variable (Zeiger) zugreifen können.

Schauen wir uns erst den Befehl an und dann kommt die Erklärung:

verbindung = sqlite3.connect("geburtstage.db")

Wir bauen also eine Verbindung (engl. „connection“ und das Verb verbinden „connect“) zu unserer Datenbank „geburtstage.db“ auf. Gibt es diese Datenbank noch nicht, legt unser Datenbanksystem „SQlite“ automatisch beim ersten Aufruf eine Datei im selben Ordner an.

Möchte man es nicht im gleichen Ordner wie die Python-Programme haben, dann einfach den gewünschten Unterordner angeben (der Unterordner sollte bereits angelegt sein):

verbindung = sqlite3.connect("datenbank/geburtstage.db")

Ist der Ordner nicht angelegt, schlägt das Anlegen der Datenbank fehl und wir erhalten die Fehlermeldung: „sqlite3.OperationalError: unable to open database file“

Also einfach Ordner im Betriebssystem anlegen, bevor wir unseren connect-Befehl darauf loslassen!

Schritt 2: Cursor-Objekt cursor()

Im nächsten Schritt wird das Cursor-Objekt eingerichtet. Was ist ein Cursor eigentlich? Man verwendet schon immer auf dem Bildschirm den Cursor, hat sich aber noch nie gefragt, woher dieses Wort wohl kommt. Wie das meiste entweder aus dem Lateinischen oder Griechischen. Im Lateinischen hat das Wort Cursor die Bedeutung von „Läufer“. Mit dem Cursor wird die aktuelle Bearbeitungsposition auf dem Bildschirm gezeigt. Mit dem Datenbankcursor das gleiche – aber auf den Datenbanksatz bezogen. Er zeigt also die aktuelle Position beim Lesen bzw. Schreiben von Datensätzen.

So ein Objekt wollen wir nun erzeugen:

import sqlite3
verbindung = sqlite3.connect("datenbank/geburtstage.db")
zeiger = verbindung.cursor()

Ab jetzt können wir unseren Zeiger verwenden.

Schritt 3: SQL-Code erstellen und an Datenbank senden: execute()

Jetzt können wir unsere SQL-Anweisung an die Datenbank übergeben. Mit dieser Anweisung sagen wir der Datenbank, was zu tun ist. Ob Beispielsweise ein neuer Datensatz angelegt wird oder die Datenbank bestimmte Datensätze zurück liefern soll, damit wir diese anzeigen können. Die Übergabe läuft als String ab. Mit der Anweisung execute() wird die SQL-Anweisung ausgeführt.

Bisher haben wir eine Datenbank mit dem Namen „geburtstage.db“. Allerdings haben wir noch keine Tabellen in der Datenbank. Grundsätzlich wäre der Aufbau unseres execute-Befehls:

zeiger.execute(SQL-Anweisung)

Was steht nun in unserer SQL-Anweisung?

Eine Tabelle besteht wie in Excel aus Zeilen und Spalten. In Excel wird für die Spalten automatisch die Benennung „A, B, C, … AA, AB“ verwendet. Das wäre für uns eher unpraktisch. Im Unterschied zu Excel vergeben wir also für unsere Datenbank für jede Spalte:

  • einen Namen (damit wir die „Spalte“ ansprechen können)
  • die Art der Inhalte (String, Integer, Datum etc.)
  • die Feldlänge

Wir erzeugen (engl. „create“) eine Tabelle (engl. „table“) die einen Namen hat.

zeiger.execute("CREATE TABLE personen (vorname VARCHAR(20), nachname VARCHAR(30), geburtstag DATE)")

Gerne wird eine SQL-Anweisung auch als String vorbereitet und dann dieser String der Anweisung execute übergeben. Das macht die SQL-Anweisung besser lesbar und somit können sich Fehler nicht so einfach einschleichen. Also nochmals die gleiche Anweisung wie oben:

sql_anweisung = """
CREATE TABLE personen (
vorname VARCHAR(20), 
nachname VARCHAR(30), 
geburtstag DATE
);"""

zeiger.execute(sql_anweisung)

Schritt 4: Anweisung ausführen lassen mit commit()

Beim Verändern von Daten in der Datenbank ist eine weitere Bestätigung zum Ausführen notwendig. Die übergebene SQL-Anweisung muss nun ausgeführt werden. Dazu wird über den Befehl commit() dem Datenbanksystem mitgeteilt, dass endgültig die Anweisung ausgeführt werden darf. In unserem Beispiel wird also die Tabelle angelegt:

import sqlite3
verbindung = sqlite3.connect("datenbank/geburtstage.db")
zeiger = verbindung.cursor()

sql_anweisung = """
CREATE TABLE personen (
vorname VARCHAR(20), 
nachname VARCHAR(30), 
geburtstag DATE
);"""

zeiger.execute(sql_anweisung)

verbindung.commit()

Schritt 5: Verbindung schließen mit close()

Aufräumen ist immer eine gute Sache. Also schließen wir die Verbindung nach getaner Arbeit über die Anweisung close()

verbindung.close()

kompletter Code zum Tabelle anlegen

Und hier unser kompletter Code:

import sqlite3
verbindung = sqlite3.connect("datenbank/geburtstage.db")
zeiger = verbindung.cursor()

sql_anweisung = """
CREATE TABLE personen (
vorname VARCHAR(20), 
nachname VARCHAR(30), 
geburtstag DATE
);"""

zeiger.execute(sql_anweisung)

verbindung.commit()
verbindung.close()

Jetzt können wir unser Programm ausführen lassen und erhalten unsere Datenbank angelegt. Auch wenn es noch keine Inhalte gibt, wird die Datei „geburtstage.db“ erzeugt und besitzt eine Dateigröße (es steckt jetzt die vorbereitete Struktur darin).

Lassen wir den Code nochmals ausführen, bekommen wir eine Fehlermeldung:

sqlite3.OperationalError: table personen already exists

Diesen Fehler können wir vermeiden, indem wir die SQL-Anweisung nur ausführen lassen, wenn noch keine Tabelle existiert. Wir erweitern dazu unsere SQL-Anweisung um „IF NOT EXISTS”:

sql_anweisung = """
CREATE TABLE IF NOT EXISTS personen (
vorname VARCHAR(20), 
nachname VARCHAR(30), 
geburtstag DATE
);"""