user
es una palabra reservada
. Es un alias para current_user
.
regress=> SELECT * FROM user;
current_user
--------------
myusername
(1 row)
Si desea utilizar user
como nombre de tabla, dado que es una palabra reservada, debe citar el identificador , por ejemplo:
SELECT id FROM "user";
Su ORM debe citar todos los identificadores, o al menos palabras reservadas. El no hacerlo es un error en su ORM. Puede evitar el error de ORM utilizando una palabra no reservada como nombre de tabla.
Creo que es una pequeña verruga en psql
que cita automáticamente los identificadores que pasa a los comandos de barra invertida. Entonces \d user
funcionará pero select * from user
no. Deberías escribir \d "user"
. El mismo problema surge con la distinción entre mayúsculas y minúsculas donde \d MyTable
funciona pero SELECT * FROM MyTable
no funcionará, debe escribir SELECT * FROM "MyTable"
.
Sería bueno dar una HINT
mensaje sobre esto en el error. Desafortunadamente, el analizador y el planificador realmente no tienen suficiente información en el momento en que se genera el error "la columna no existe" para saber que originalmente escribió una palabra clave, todo lo que ve es un escaneo de función en ese punto.