PostgreSQL-Fehler: column does not exist
ERROR: column "createdat" does not exist
LINE 1: SELECT createdAt FROM users;
^
HINT: Perhaps you meant to reference the column "users.createdAt".
PostgreSQL konnte einen Spaltennamen nicht auflösen — und sehr oft sagt Ihnen der HINT bereits, warum. Schauen Sie auf das Beispiel: die Query sagt createdAt, der Fehler sagt "createdat", der Hinweis bietet "users.createdAt" an. Das ist die Kleinschreibungs-Umwandlungsregel am Werk.
Was dieser Fehler bedeutet
Zwei SQL-Regeln erzeugen fast alle dieser Fehler:
- Ungequotete Bezeichner werden in Kleinbuchstaben umgewandelt. Eine als
"createdAt"(gequotet — ORMs und GUI-Tools lieben das) erstellte Spalte kann nur als"createdAt"referenziert werden. Ungequotet bedeutetcreatedAtgleichcreatedat, ein anderer Name. - Doppelte Anführungszeichen begrenzen Bezeichner, einfache begrenzen Strings.
WHERE name = "alice"vergleicht nicht mit dem String 'alice' — es sucht nach einer Spalte namensaliceund schlägt mit genau diesem Fehler fehl.
Häufige Ursachen
- Gemischt-groß-/kleingeschriebene Spalte, mit Anführungszeichen erstellt, ohne referenziert (oder umgekehrt).
- Doppelte Anführungszeichen für ein String-Literal verwendet — das verräterische Zeichen ist, dass die "fehlende Spalte" ein Datenwert ist.
- Ein SELECT-Alias in
WHEREverwendet: Aliase sind dort nicht sichtbar (die WHERE-Klausel wird vor der Select-Liste ausgewertet).SELECT price * qty AS total ... WHERE total > 100schlägt fehl. - Schema-Drift: die Spalte existiert in dieser Umgebung wirklich nicht, weil eine Migration nicht gelaufen ist.
So diagnostizieren Sie ihn
\d users -- Namen und GENAUE Groß-/Kleinschreibung der Spalten
Vergleichen Sie Zeichen für Zeichen, einschließlich Groß-/Kleinschreibung. Wenn die Query von einem ORM erzeugt wird, protokollieren Sie das tatsächliche SQL — das Quoting, das das ORM ausgibt, ist die ganze Geschichte.
So beheben Sie ihn
- Groß-/Kleinschreibungsproblem → quoten Sie es exakt (
"createdAt") — oder beenden Sie den Schmerz dauerhaft:
Kleingeschriebene snake_case-Bezeichner, nie gequotet, sind die Konvention, die diese Fehlerklasse vollständig vermeidet.ALTER TABLE users RENAME COLUMN "createdAt" TO created_at; - String-Literal → einfache Anführungszeichen:
WHERE name = 'alice'. - Alias in WHERE → wiederholen Sie den Ausdruck, oder kapseln Sie die Query:
SELECT * FROM (SELECT price * qty AS total ...) t WHERE total > 100.
🔍
Dieselben Regeln, Tabellen-Edition: relation does not exist — search_path und gequotete Bezeichner.
