user
ist ein reserviertes Wort
. Es ist ein Alias für current_user
.
regress=> SELECT * FROM user;
current_user
--------------
myusername
(1 row)
Wenn Sie user
verwenden möchten als Tabellenname, da es sich um ein reserviertes Wort handelt, müssen Sie den Bezeichner in Anführungszeichen setzen , z. B.:
SELECT id FROM "user";
Ihr ORM sollte alle Bezeichner oder zumindest reservierte Wörter zitieren. Wenn Sie dies nicht tun, liegt ein Fehler in Ihrem ORM vor. Sie können den ORM-Fehler umgehen, indem Sie ein nicht reserviertes Wort als Tabellennamen verwenden.
Ich denke, es ist ein bisschen eine Warze in psql
dass es automatisch Bezeichner zitiert, die Sie an Backslash-Befehle übergeben. Also \d user
funktioniert, aber select * from user
Gewohnheit. Sie sollten \d "user"
schreiben müssen . Das gleiche Problem tritt bei der Unterscheidung zwischen Groß- und Kleinschreibung auf, wenn \d MyTable
funktioniert, aber SELECT * FROM MyTable
nicht funktionieren, müssen Sie SELECT * FROM "MyTable"
schreiben .
Es wäre nett, einen HINT
zu geben Nachricht darüber in der Fehlermeldung. Leider hat der Parser und Planer zu dem Zeitpunkt, an dem der Fehler „Spalte existiert nicht“ generiert wird, nicht wirklich genügend Informationen, um zu wissen, dass Sie ursprünglich ein Schlüsselwort geschrieben haben. Alles, was er an diesem Punkt sieht, ist ein Funktionsscan.