Sitzung 6 — Datenbanken mit SQLite
Debugging mit KI — Günther (A) & Roberta (B) haben je vier kleine Probleme
4 Probleme mit einem KI-Tool erarbeiten & kritisch prüfen
Erkenntnisse gegenseitig erklären (A ↔ B)
Gruppe A oder B?
A: Günther · B: Roberta — Bugs mit KI lösen
gegenseitig erklären
Name eingeben → passende Session wählen → Passwort eis
| Navigation / Seite fehlt | falscher Datei-Pfad |
| Änderung erscheint nicht | Browser-Cache → Hard Reload |
| Flask läuft nicht / App tot | venv nicht aktiviert · Terminal geschlossen |
| Pinnwand / Zähler leer | Daten beim Neustart weg — ? |
Warm-up, bevor wir die Datenbank anschließen:
Laufcheck: läuft eure App unter /app/? Notfalls venv aktivieren & python3 app.py.
Kleine Änderung: Text/Route anpassen → committen → Sync.
Mini-Rätsel: eine Route mit einer Frage & Antwortprüfung — das erweitern wir gleich mit der DB.
Schritt für Schritt in der Übung u18.
Bisher: Liste im Arbeitsspeicher
eintraege = [] # nur im RAM
Beim Neustart der App ist alles weg.
Mit Datenbank
Daten liegen dauerhaft auf der Festplatte. Neustart? Alles noch da. Strukturiert abfragbar, erweiterbar, von mehreren Stellen nutzbar.
Eine Datenbank ist ein strukturiertes, dauerhaftes Abbild der Daten eurer Anwendung.
| Server-DB (MySQL, PostgreSQL) | eigener Server, Nutzer, Passwörter — für große Systeme |
| Datei-DB (SQLite) | eine Datei, kein Server, in Python eingebaut |
import sqlite3 ist schon da, die ganze Datenbank ist eine Datei (adventure.db) — ideal für eine App auf einem Server. Gleiche Abfragesprache (SQL) wie die Großen.
SQL = relational (Tabellen). Daneben gibt es NoSQL (z. B. Dokumente) — für uns hier ist SQL genau richtig.
CREATE TABLE raeume ( -- Tabelle anlegen
id INTEGER PRIMARY KEY,
name TEXT,
beschreibung TEXT
);
INSERT INTO raeume (name, beschreibung) -- Zeile einfügen
VALUES ('Eingangshalle', 'Eine schwere Tür fällt hinter dir zu.');
SELECT * FROM raeume WHERE id = 1; -- Daten abfragen
UPDATE raeume SET beschreibung = '...' WHERE id = 1; -- ändern
CREATE anlegen · INSERT hinzufügen · SELECT lesen · UPDATE ändern
Ein Adventure ist von Natur aus relational: Räume und ihre Ausgänge.
raeume
| id (PK) | name | beschreibung |
| 1 | Eingangshalle | … |
| 2 | Krypta | … |
ausgaenge
| von_raum | richtung | nach_raum |
| 1 | links | 2 |
| 1 | rechts | 3 |
Primärschlüssel (id) macht jede Zeile eindeutig. Fremdschlüssel (von_raum, nach_raum) verweisen auf raeume.id — so hängen die Tabellen zusammen.
Jeder Raum zeigt seine Beschreibung; die Ausgänge werden zu Klick-Buttons. Ein Klick lädt den nächsten Raum aus der DB.
Gestaltung: modern & minimalistisch — dunkle Fläche, klare moderne Schrift, dezenter Akzent. Kein 3D, keine Spielereien. Eure eigenen Ideen & Farben ausdrücklich erwünscht.
Kaltes Kerzenlicht flackert. Zwei Gänge führen ins Dunkel.
public_html/app/
├── app.py # Flask: / und /raum/<id>
├── init_db.py # Tabellen + Starträume (im Repo)
├── adventure.db # entsteht auf dem Server (untracked)
└── venv/ # (untracked)
import sqlite3
@app.route("/raum/<int:id>")
def raum(id):
db = sqlite3.connect("adventure.db")
r = db.execute(
"SELECT name, beschreibung "
"FROM raeume WHERE id=?", (id,)
).fetchone()
...
sqlite3 ist in Python eingebaut. Ihr legt adventure.db einmalig per init_db.py auf dem Server an. Reinschauen: VS-Code-Extension „SQLite“. Die .db ist untracked und bleibt bei Auto-Deploy erhalten (*.db in .gitignore nur als Sicherheitsnetz).
Dateien schreibt ihr lokal. Ausgeführt — und die Datenbank angelegt — wird auf dem Server.
Neue / geänderte Dateien in app/:
init_db.py neuapp.py (+ sqlite3, Route /raum).gitignore (+ *.db, optional)→ Stage · Commit · Sync
Forgejo-Repository — euer Stand liegt zentral.
Dateien kommen automatisch an. Dann einmalig im Terminal:
source venv/bin/activate
python3 init_db.py # legt adventure.db an
python3 app.py # App starten
adventure.db entsteht auf dem Server (durch init_db.py), ist dort untracked und bleibt bei Auto-Deploy erhalten (reset --hard lässt untrackte Dateien in Ruhe). Der Server pullt nur, pusht nie. *.db in .gitignore ist nur ein optionales Sicherheitsnetz.Für alle — Schritt für Schritt: u18
init_db.py anlegen → auf dem Server ausführen (Tabellen + 3 Starträume)app.py um sqlite3 + Route /raum/<id> erweitern → durch die Räume klickenPflicht: einen eigenen Raum + Ausgang per INSERT ergänzen.
Für Schnellere: Spielstand speichern (UPDATE) oder ein Rätsel als Tür-Schloss einbauen.
Nächstes Mal: Adventure ausbauen — mehr Räume, Rätsel, Spielstand.