user
è una parola riservata
. È un alias per current_user
.
regress=> SELECT * FROM user;
current_user
--------------
myusername
(1 row)
Se vuoi usare user
come nome di una tabella, poiché è una parola riservata, devi citare l'identificatore tra virgolette , ad esempio:
SELECT id FROM "user";
Il tuo ORM dovrebbe citare tutti gli identificatori o almeno le parole riservate. In caso contrario, è un bug nel tuo ORM. Puoi aggirare il bug ORM utilizzando una parola non riservata come nome di tabella.
Penso che sia un po' una verruca in psql
che citi automaticamente gli identificatori che passi ai comandi della barra rovesciata. Quindi \d user
funzionerà ma select * from user
non. Dovresti scrivere \d "user"
. Lo stesso problema si verifica con la distinzione tra maiuscole e minuscole dove \d MyTable
funziona ma SELECT * FROM MyTable
non funzionerà, devi scrivere SELECT * FROM "MyTable"
.
Sarebbe bello dare un HINT
messaggio su questo nell'errore. Sfortunatamente il parser e il pianificatore non hanno informazioni sufficienti nel momento in cui viene generato l'errore "colonna non esiste" per sapere che hai originariamente scritto una parola chiave, tutto ciò che vede è una scansione della funzione a quel punto.