Im Tutorial zu Dateien haben wir mit open gelesen und geschrieben. Aber eine Text- oder CSV-Datei bringt Sie nur bis zu einem gewissen Punkt: Sobald Sie „nur die Zitate dieses Autors” oder „keine Duplikate hinzufügen” brauchen, durchlaufen Sie in Python die ganze Datei. Eine Datenbank erledigt das mit einer Zeile SQL. Die gute Nachricht: sqlite3 gehört zur Python-Standardbibliothek — nichts zu installieren.

Eine Datenbank und Ihre erste Tabelle anlegen

import sqlite3

conn = sqlite3.connect("quotes.db")
cursor = conn.cursor()

cursor.execute("""
    CREATE TABLE IF NOT EXISTS quotes (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        text TEXT NOT NULL,
        author TEXT NOT NULL,
        UNIQUE(text, author)
    )
""")
conn.commit()

sqlite3.connect("quotes.db") erstellt die Datei, falls sie noch nicht existiert. UNIQUE(text, author) garantiert, dass dasselbe Zitat desselben Autors nie doppelt eingefügt wird.

Daten sicher einfügen — und warum Sie Strings nie von Hand zusammenkleben sollten

# Falsch — schreiben Sie es nie so:
cursor.execute(f"INSERT INTO quotes (text, author) VALUES ('{text}', '{author}')")

Enthält text ein Apostroph oder SQL-Syntax, bricht das Ihre Abfrage — oder öffnet schlimmstenfalls die Tür für SQL-Injection, dieselbe Risikofamilie, vor der wir beim Umgang mit dem Token im Telegram-Bot-Tutorial gewarnt haben. Der richtige Weg ist immer der ?-Platzhalter:

cursor.execute(
    "INSERT OR IGNORE INTO quotes (text, author) VALUES (?, ?)",
    (text, author)
)
conn.commit()

Python escaped den Wert für Sie; Ihre Daten landen nie direkt im SQL-String. INSERT OR IGNORE bedeutet: Eine doppelte Zeile (durch die UNIQUE-Regel erkannt) wird still übersprungen, statt einen Fehler zu werfen.

Ein echtes Beispiel: quotes.csv in die Datenbank importieren

Wir übertragen die komplette quotes.csv aus dem Web-Scraping-Tutorial nach SQLite:

import csv
import sqlite3

conn = sqlite3.connect("quotes.db")
cursor = conn.cursor()

cursor.execute("""
    CREATE TABLE IF NOT EXISTS quotes (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        text TEXT NOT NULL,
        author TEXT NOT NULL,
        UNIQUE(text, author)
    )
""")

with open("quotes.csv", encoding="utf-8-sig") as f:
    reader = csv.DictReader(f)
    for row in reader:
        cursor.execute(
            "INSERT OR IGNORE INTO quotes (text, author) VALUES (?, ?)",
            (row["text"], row["author"])
        )

conn.commit()
print(f"{cursor.rowcount} Zeile(n) in diesem Lauf eingefügt")
conn.close()

Daten lesen

conn = sqlite3.connect("quotes.db")
cursor = conn.cursor()

cursor.execute("SELECT text, author FROM quotes")
for text, author in cursor.fetchall():
    print(f"{text}{author}")

fetchall() gibt alle Zeilen auf einmal zurück; bei sehr großen Tabellen rufen Sie stattdessen fetchone() in einer Schleife auf, damit nicht alles im Speicher landet.

Filtern und suchen

# Nur Zitate eines bestimmten Autors
cursor.execute("SELECT text FROM quotes WHERE author = ?", ("Albert Einstein",))

# Im Text suchen
cursor.execute("SELECT text, author FROM quotes WHERE text LIKE ?", ("%life%",))

Auch hier gilt dieselbe Regel: Der Suchwert geht immer über den ?-Platzhalter, niemals direkt in den SQL-String — ohne Ausnahme.

Aktualisieren und löschen

cursor.execute("UPDATE quotes SET author = ? WHERE id = ?", ("Neuer Autor", 3))
cursor.execute("DELETE FROM quotes WHERE id = ?", (3,))
conn.commit()

Die Datenbank ansehen, ohne Code zu schreiben

Um quotes.db ohne Python zu durchstöbern, installieren Sie DB Browser for SQLite — kostenlos und quelloffen. Öffnen Sie die .db-Datei und durchsuchen Sie die Tabellen wie eine Tabellenkalkulation.

Wann SQLite reicht — und wann Sie migrieren sollten

  • Für persönliche Skripte, Desktop-Tools oder alles mit nur einem gleichzeitigen Nutzer reicht SQLite völlig: leichtgewichtig, kein Server nötig, nur eine Datei
  • Sobald mehrere Nutzer gleichzeitig schreiben müssen — etwa eine Webanwendung mit echtem Traffic — ist es Zeit für PostgreSQL oder MySQL

Übung

Fügen Sie der Tabelle quotes eine Spalte tags hinzu (ALTER TABLE quotes ADD COLUMN tags TEXT) und passen Sie das Import-Skript so an, dass es auch die Tags jedes Zitats aus der CSV liest und in dieser Spalte speichert.

Zurück zu den Tutorials