user
är ett reserverat ord
. Det är ett alias för current_user
.
regress=> SELECT * FROM user;
current_user
--------------
myusername
(1 row)
Om du vill använda user
som ett tabellnamn, eftersom det är ett reserverat ord måste du citera identifieraren , t.ex.:
SELECT id FROM "user";
Din ORM bör citera alla identifierare, eller åtminstone reserverade ord. Att inte göra det är en bugg i din ORM. Du kan kringgå ORM-felet genom att använda ett icke-reserverat ord som tabellnamn.
Jag tycker att det är lite av en vårta i psql
att den automatiskt citerar identifierare som du skickar till kommandon med snedstreck. Så \d user
kommer att fungera men select * from user
vana. Du bör behöva skriva \d "user"
. Samma problem uppstår med skiftlägeskänslighet där \d MyTable
fungerar men SELECT * FROM MyTable
kommer inte att fungera måste du skriva SELECT * FROM "MyTable"
.
Det skulle vara trevligt att ge ett HINT
meddelande om detta i felet. Tyvärr har tolken och planeraren inte riktigt tillräckligt med information när felet "kolumnen existerar inte" genereras för att veta att du ursprungligen skrev ett nyckelord, allt den ser är en funktionsskanning vid den tidpunkten.