PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

L'ID de la colonne Doctrine n'existe pas sur PostgreSQL

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.