user
er et reserveret ord
. Det er et alias for current_user
.
regress=> SELECT * FROM user;
current_user
--------------
myusername
(1 row)
Hvis du vil bruge user
som et tabelnavn, da det er et reserveret ord, skal du citere identifikatoren , f.eks.:
SELECT id FROM "user";
Din ORM bør citere alle identifikatorer, eller i det mindste reserverede ord. Undladelse af at gøre det er en fejl i din ORM. Du kan omgå ORM-fejlen ved at bruge et ikke-reserveret ord som tabelnavn.
Jeg synes, det er lidt af en vorte i psql
at den automatisk citerer identifikatorer, du sender til backslash-kommandoer. Så \d user
vil virke, men select * from user
vil ikke. Du skal skrive \d "user"
. Det samme problem opstår med store og små bogstaver, hvor \d MyTable
virker, men SELECT * FROM MyTable
ikke virker, skal du skrive SELECT * FROM "MyTable"
.
Det ville være rart at give et HINT
besked om dette i fejlen. Desværre har parseren og planlæggeren ikke rigtig nok information på det tidspunkt, hvor "kolonnen eksisterer ikke"-fejlen bliver genereret til at vide, at du oprindeligt skrev et søgeord, det eneste, den ser, er en funktionsscanning på det tidspunkt.