Mit einer SQLite-Datenbank in Python arbeiten
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.