5. Unterrichtsblock

Python & Datenbanken

Python kann in Datenbankanwendungen verwendet werden. Eine der beliebtesten Datenbanken ist MySQL. Da der Verbindungsaufbau hierfür jedoch zu umfangreich und kompliziert ist, verwenden wir die leichtgewichtigere Version „SQLite“, welche ideal in Python verarbeitet werden kann.

SQLite Installation und Verbindungsaufbau

Um mit den Codebeispielen in diesem Tutorial experimentieren zu können, müssen wir SQLite importieren. Wir

import sqlite3

Verbindung herstellen

Sie müssen eine Verbindung zu einer Datenbankdatei herstellen. Falls die Datei noch nicht existiert, wird sie von SQLite automatisch erstellt.

# Erstellt eine Datei namens 'meine_datenbank.db' im aktuellen Ordner
connection = sqlite3.connect('meine_datenbank.db')

Cursor herstellen

Der Cursor ist das Werkzeug, mit dem Sie tatsächlich SQL-Befehle an die Datenbank senden. Ohne ihn können Sie keine Daten abfragen oder speichern.

# Erstellt eine Datei namens 'meine_datenbank.db' im aktuellen Ordner
connection = sqlite3.connect('meine_datenbank.db')

Datenbank erstellen & typischer Ablauf

Hier ist der typische Ablauf, inklusive der Erstellung einer Tabelle:

import sqlite3

# 1. Verbindung aufbauen
connection = sqlite3.connect('meine_datenbank.db')
cursor = connection.cursor()

# 2. Eine Tabelle erstellen (falls sie noch nicht existiert)
cursor.execute('''
    CREATE TABLE IF NOT EXISTS nutzer (
        id INTEGER PRIMARY KEY,
        name TEXT
    )
''')

# 3. Änderungen speichern (Commit)
connection.commit()

# 4. Verbindung schließen
connection.close()

Wenn der obige Code ohne Fehler ausgeführt wurde, haben wir erfolgreich eine Datenbank erstellt.

Das cursor() Objekt

Der sqlite3.Cursor wird verwendet, um SQL-Befehle an die SQLite-Datenbank zu senden und Ergebnisse zu verarbeiten. Er wird über die Methode connection.cursor() erstellt.

Wichtige Methoden des Cursor-Objekts

Nr.MethodeBeschreibung
1(Entfällt)SQLite unterstützt keine callproc(), da es keine „Stored Procedures“ wie MySQL besitzt.
2close()Schließt das Cursor-Objekt.
3(Entfällt)Eine direkte info() Methode gibt es nicht; Informationen werden oft über connection.total_changes oder PRAGMA-Befehle abgerufen.
4executemany()Führt einen SQL-Befehl für eine Liste von Parameter-Sätzen aus (z. B. Massen-Insert).
5execute()Führt eine einzelne SQL-Anweisung aus. Platzhalter werden mit ? statt %s markiert.
6fetchall()Ruft alle verbleibenden Zeilen eines Abfrageergebnisses ab und gibt eine Liste von Tupeln zurück.
7fetchone()Ruft die nächste einzelne Zeile des Ergebnisses ab.
8fetchmany(size)Ruft die nächste Gruppe von Zeilen ab (Anzahl über size steuerbar).
9(Entfällt)fetchwarnings() existiert in SQLite nicht. Fehler werden direkt als Exceptions (z.B. sqlite3.Error) geworfen.

Wichtige Eigenschaften (Attribute)

Nr.EigenschaftBeschreibung
1(Spaltennamen)In SQLite erhält man Spaltennamen meist über description oder indem man die row_factory auf sqlite3.Row umstellt.
2descriptionGibt Metadaten zur letzten Abfrage zurück (Spaltennamen, Datentypen). Ist None, wenn keine Zeilen zurückgegeben wurden.
3lastrowidGibt die ID der zuletzt eingefügten Zeile (INSERT) zurück.
4rowcountGibt die Anzahl der betroffenen Zeilen an (funktioniert zuverlässig bei UPDATEINSERTDELETE).
5connection(Zusatz) Ein SQLite-Cursor bietet Zugriff auf das ursprüngliche Connection-Objekt, mit dem er erstellt wurde.

Zusammenfassung der Unterschiede zu MySQL:

  • Platzhalter: Verwenden Sie in SQLite ? (z.B. cursor.execute("SELECT * FROM table WHERE id=?", (id,))) anstelle der MySQL-Syntax.
  • Stored Procedures: Da SQLite eine einfache Datei ist, gibt es kein callproc(). Logik wird stattdessen direkt in Python geschrieben.
  • Transaktionen: Denken Sie daran, dass Änderungen (INSERT/UPDATE/DELETE) erst durch connection.commit() (auf dem Connection-Objekt, nicht dem Cursor) dauerhaft gespeichert werden. Weitere Informationen in der Python-Dokumentation.

Überprüfen, ob eine Datenbank existiert

Wir können prüfen, ob eine Datenbank vorhanden ist, indem wir alle Datenbanken auflisten. Mit der SHOW DATABASES Anweisung. Rückgabe eine Liste der Datenbanken eines Systems:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="nutzername",
  password="meinpasswort"
)

mycursor = mydb.cursor()

mycursor.execute("SHOW DATABASES")

for x in mycursor:
  print(x)

Oder wir können versuchen, auf die Datenbank zuzugreifen, wenn wir die Verbindung herstellen. Beispielhafter Aufbau, einer Verbindung mit der Datenbank „meinedatenbank“ beim Aufbau der Verbindung:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="nutzername",
  password="meinpasswort",
  database="meinedatenbank"
)
# Wenn es die Datenbank nicht gibt, erhalten wir einen Fehler.

Tabellen erstellen

Um eine Tabelle in MySQL zu erstellen, verwenden wir die CREATE TABLE-Anweisung. Hierbei stellen wir sicher, dass wir den Namen der Datenbank definieren, wenn wir die Verbindung erstellen

Erstellen einer Tabelle mit dem Namen „Kunden“:

import mysql.connector

# Aufbau der Verbindung
mydb = mysql.connector.connect(
  host="localhost",
  user="nutzername",
  password="meinpasswort",
  database="meinedatenbank"
)

mycursor = mydb.cursor()

mycursor.execute("CREATE TABLE kunden (name VARCHAR(255), addresse VARCHAR(255))")

Wenn der obige Code ohne Fehler ausgeführt wurde, wurde eine Tabelle erstellt.

Überprüfung, ob eine Tabelle existiert

Wir können überprüfen, ob eine Tabelle existiert, indem wir alle Tabellen in der Datenbank mit der SHOW TABLES-Anweisung auflisten:

Rückgabe eine Liste aller Datenbanken:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="nutzername",
  password="meinpasswort",
  database="meinedatenbank"
)

mycursor = mydb.cursor()

mycursor.execute("SHOW TABLES")

for x in mycursor:
  print(x)

Primärschlüssel

Wenn wir eine Tabelle erstellen, benötigen wir auch eine Spalte mit einem eindeutigen Schlüssel für jeden Eintrag.

Dies kann durch die Definition eines PRIMARY KEY geschehen.

Wir verwenden die Anweisung INT AUTO-INCREMENT PRIMARY KEY, die eindeutige Nummer für jeden Eintrag setzt. Die Anweisung beginnt bei 1 (nicht 0) zu zählen und erhöht sich (inkrementiert) bei jedem weiteren Eintrag um +1.

Erstellen eines primären Schlüssels bei der Erstellung der Tabelle:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="nutzername",
  password="meinpasswort",
  database="meinedatenbank"
)

mycursor = mydb.cursor()

mycursor.execute("CREATE TABLE kunden (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), addresse VARCHAR(255))")

Wenn die Tabelle bereits existiert, verwenden wir das ALTER TABLE-Schlüsselwort:

Erstellen eines Primärschlüssel in einer vorhandenen Tabelle:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="nutzername",
  password="meinpasswort",
  database="meinedatenbank"
)

mycursor = mydb.cursor()

mycursor.execute("ALTER TABLE kunden ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY")

Aufgaben

  • Erstelle eine Datei, die die nötigen Funktionen über Module einbindet, die Du baust
  • Erstelle ein Modul das:
    • Eine Datenbank mit mehreren Tabellen erstellt
  • Befülle die Tabellen mit Inhalt
    • Versuche dabei Schleifen anzuwenden
  • Frage den Inhalt ab und erstelle hierfür ein Modul, welches de Code dafür enthält
    • Erstelle eine Funktion, die prüft, ob ein bestimmter Wert in der Datenbank enthalten ist
    • Die Eingabe der Abfrage soll über eine Input-Funktion erfolgen