Daten speichern mit Supabase
Im letzten Teil hast du eine API gebaut, die Daten in einer Python-Liste speichert. Das Problem: sobald du den Server neu startest, sind alle Daten weg.
In diesem Teil lernst du, wie du Daten dauerhaft in einer Datenbank speicherst – mit Supabase.
Was ist Datenpersistenz?
Persistenz bedeutet, dass Daten erhalten bleiben – auch wenn das Programm beendet wird oder der Server neu startet. Dafür braucht man eine Datenbank.
Eine Datenbank ist wie eine riesige, gut organisierte Tabelle (oder eine Sammlung davon). Statt Daten im Arbeitsspeicher (RAM) zu halten, werden sie auf der Festplatte gespeichert.
| Ohne Datenbank | Mit Datenbank |
|---|---|
| Daten im RAM (Python-Liste) | Daten auf der Festplatte |
| Gehen verloren beim Neustart | Bleiben dauerhaft erhalten |
| Nur auf einem Server nutzbar | Von überall erreichbar |
Was ist Supabase?
Supabase ist ein Open-Source-Backend-as-a-Service. Auf Deutsch: Es ist eine fertige Datenbanklösung, die du kostenlos in der Cloud nutzen kannst – ohne selbst einen Datenbankserver aufzusetzen.
Supabase basiert auf PostgreSQL, einer der beliebtesten relationalen Datenbanken. Du kannst Tabellen erstellen, Daten einfügen, lesen, ändern und löschen – alles über eine einfache Web-Oberfläche oder über Python-Code.
Supabase einrichten
1. Konto erstellen
Gehe auf supabase.com und erstelle ein kostenloses Konto. Du kannst dich mit GitHub anmelden.
2. Neues Projekt erstellen
- Klicke auf New project
- Gib deinem Projekt einen Namen, z.B.
aufgaben-api - Wähle ein sicheres Datenbankpasswort (merke es dir!)
- Wähle eine Region (z.B.
West EU (London)) - Klicke auf Create new project
Das Projekt wird in etwa einer Minute aufgesetzt.
3. Tabelle erstellen
Klicke in der linken Seitenleiste auf Table Editor, dann auf New table.
Erstelle eine Tabelle mit folgenden Einstellungen:
- Name:
aufgaben - Enable Row Level Security (RLS): ausschalten (für jetzt, fürs Lernen)
Füge folgende Spalten hinzu (die id-Spalte ist bereits vorhanden):
| Name | Typ | Default |
|---|---|---|
id | int8 | auto (bereits vorhanden) |
titel | text | – |
erledigt | bool | false |
Klicke auf Save.
4. API-Schlüssel holen
Klicke auf das Zahnrad-Symbol (Settings) → API.
Du siehst zwei wichtige Werte:
- Project URL – die Adresse deiner Datenbank, z.B.
https://xyz.supabase.co - anon public key – der öffentliche API-Schlüssel
Kopiere beide Werte. Du brauchst sie gleich.
Python-Bibliothek installieren
Supabase bietet eine offizielle Python-Bibliothek:
pip install supabaseDie API mit Supabase verbinden
Jetzt passen wir die app.py aus dem letzten Teil an, damit sie die Daten in Supabase speichert.
Erstelle zuerst eine neue Datei .env im gleichen Ordner wie app.py und trage deine Supabase-Zugangsdaten ein:
pip install python-dotenvSUPABASE_URL=https://deine-projekt-url.supabase.co
SUPABASE_KEY=dein-anon-public-keyWichtig: Füge .env zu einer .gitignore-Datei hinzu, damit du deine Schlüssel nicht versehentlich auf GitHub hochlädst!
# .gitignore
.envDie neue app.py mit Supabase
Hier ist die vollständige, aktualisierte app.py:
from flask import Flask, request, jsonify
from supabase import create_client
from dotenv import load_dotenv
import os
# Umgebungsvariablen aus .env laden
load_dotenv()
app = Flask(__name__)
# Supabase-Client erstellen
supabase = create_client(
os.getenv("SUPABASE_URL"),
os.getenv("SUPABASE_KEY")
)
@app.route("/aufgaben", methods=["GET"])
def get_aufgaben():
result = supabase.table("aufgaben").select("*").execute()
return jsonify(result.data)
@app.route("/aufgaben", methods=["POST"])
def create_aufgabe():
daten = request.get_json()
if not daten or "titel" not in daten:
return jsonify({"fehler": "Feld 'titel' fehlt"}), 400
result = supabase.table("aufgaben").insert({
"titel": daten["titel"],
"erledigt": False
}).execute()
return jsonify(result.data[0]), 201
@app.route("/aufgaben/<int:aufgabe_id>", methods=["PUT"])
def update_aufgabe(aufgabe_id):
daten = request.get_json()
result = supabase.table("aufgaben").update(daten).eq("id", aufgabe_id).execute()
if not result.data:
return jsonify({"fehler": "Aufgabe nicht gefunden"}), 404
return jsonify(result.data[0])
@app.route("/aufgaben/<int:aufgabe_id>", methods=["DELETE"])
def delete_aufgabe(aufgabe_id):
result = supabase.table("aufgaben").delete().eq("id", aufgabe_id).execute()
if not result.data:
return jsonify({"fehler": "Aufgabe nicht gefunden"}), 404
return jsonify({"nachricht": "Aufgabe gelöscht"})
if __name__ == "__main__":
app.run(debug=True)Was hat sich verändert?
- Anstatt
aufgaben.append(...)oderaufgaben.pop(...)verwenden wir jetztsupabase.table("aufgaben").insert(...)usw. - Die Supabase-Bibliothek übernimmt die gesamte Kommunikation mit der Datenbank.
- Die Daten bleiben gespeichert, auch wenn der Server neu startet.
Testen mit Postman
Starte den Server neu:
python app.pyMache dieselben Requests wie im letzten Teil (GET, POST, PUT, DELETE). Alles sollte genau gleich funktionieren – aber diesmal werden die Daten in Supabase gespeichert.
Überprüfe das direkt in Supabase: Gehe zu Table Editor → aufgaben und schau, ob deine Einträge dort erscheinen!
Daten direkt in Supabase anschauen und bearbeiten
Der Table Editor in Supabase ist wie ein einfaches Tabellenkalkulationsprogramm für deine Datenbank. Du kannst:
- Zeilen direkt bearbeiten
- Neue Einträge manuell hinzufügen
- Einträge löschen
- Filtern und suchen
Das ist sehr praktisch zum Debuggen.
Rückblick: Was hast du gelernt?
Du hast in diesen drei Teilen die Grundlagen der Backend-Entwicklung kennengelernt:
| Thema | Inhalt |
|---|---|
| Theorie | Was ist ein Backend, eine API, HTTP-Methoden, JSON, Statuscodes |
| Praxis (API) | Flask-API mit GET, POST, PUT, DELETE – getestet mit Postman |
| Datenpersistenz | Daten dauerhaft in Supabase speichern |
Das ist die Basis, auf der fast alle modernen Webanwendungen aufgebaut sind. Gut gemacht!