PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Die Doctrine-Spalten-ID existiert nicht in PostgreSQL

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.