Was ist Supabase
Open-Source Backend-as-a-Service auf PostgreSQL-Basis. PostgREST generiert automatisch eine REST API aus dem Schema. Tabelle erstellen → API steht.
Das Stack
- PostgreSQL — Die Datenbank. JSONB, Views, Funktionen, RLS.
- PostgREST — Generiert REST API aus dem public-Schema.
- GoTrue — Authentication Service (hier nicht genutzt — API Key statt JWT).
- Realtime — WebSocket-Live-Updates (optional).
- Storage — S3-kompatibel für Dateien.
Kritische Gotchas
PostgREST kann kein DDL
ALTER TABLE, CREATE INDEX — nicht möglich über die REST API. Lösung: Supabase Edge Functions mit direkter Postgres-Verbindung über SUPABASE_DB_URL.
Schema-Cache Staleness
Nach DDL-Änderungen sieht PostgREST neue Spalten nicht. Fix: NOTIFY pgrst, 'reload schema' über eine Postgres-Connection senden.
RLS Silent Failure (KRITISCH!)
Wenn Row Level Security einen Write blockt, gibt es keinen Fehler. PostgreSQL gibt einfach 0 Zeilen zurück. .single() wirft dann: “Cannot coerce the result to a single JSON object.” Das ist DER irreführendste Fehler in Supabase.
Lösung: SUPABASE_SERVICE_ROLE_KEY nutzen (umgeht RLS) wenn Auth auf API-Ebene gelöst ist.
Interaktiver Query Builder
Wähle Tabelle, Methode und Key-Typ — sieh wie SDK-Aufrufe zu PostgREST-Requests werden:
PostgREST Query Builder
Wähle Tabelle, Methode und Key-Typ — sieh wie das Supabase SDK die Query aufbaut und welche PostgREST-URL dahintersteckt.
const { data, error } = await supabase
.from('fighters')
.select('id, name, elo')GET https://[project].supabase.co/rest/v1/fighters?select=id,name,eloapikey: SUPABASE_SERVICE_ROLE_KEYFazit
RLS-Policies können Writes ohne Fehlermeldung blockieren. Das Update “funktioniert” — es betrifft nur 0 Zeilen. Die Lösung: SERVICE_ROLE_KEY nutzen oder RLS-Write-Policies auf USING (true) setzen.