user
est un mot réservé
. C'est un alias pour current_user
.
regress=> SELECT * FROM user;
current_user
--------------
myusername
(1 row)
Si vous souhaitez utiliser user
comme nom de table, puisqu'il s'agit d'un mot réservé, vous devez citer l'identifiant , par exemple :
SELECT id FROM "user";
Votre ORM doit citer tous les identifiants, ou au moins les mots réservés. Ne pas le faire est un bogue dans votre ORM. Vous pouvez contourner le bogue ORM en utilisant un mot non réservé comme nom de table.
Je pense que c'est un peu une verrue dans psql
qu'il cite automatiquement les identifiants que vous passez aux commandes antislash. Donc \d user
fonctionnera mais select * from user
ne le fera pas. Vous devriez avoir à écrire \d "user"
. Le même problème se pose avec la sensibilité à la casse où \d MyTable
fonctionne mais SELECT * FROM MyTable
ne fonctionnera pas, vous devez écrire SELECT * FROM "MyTable"
.
Ce serait bien de donner un HINT
message à ce sujet dans l'erreur. Malheureusement, l'analyseur et le planificateur n'ont pas vraiment assez d'informations au moment où l'erreur "la colonne n'existe pas" est générée pour savoir que vous avez initialement écrit un mot-clé, tout ce qu'il voit est une analyse de fonction à ce stade.