user
é uma palavra reservada
. É um alias para current_user
. regress=> SELECT * FROM user;
current_user
--------------
myusername
(1 row)
Se você quiser usar
user
como nome de tabela, pois é uma palavra reservada, você deve citar o identificador , por exemplo.:SELECT id FROM "user";
Seu ORM deve citar todos os identificadores, ou pelo menos palavras reservadas. Não fazer isso é um bug em seu ORM. Você pode contornar o bug ORM usando uma palavra não reservada como um nome de tabela.
Eu acho que é um pouco de verruga no
psql
que ele cita automaticamente os identificadores que você passa para os comandos de barra invertida. Então \d user
funcionará, mas select * from user
não vai. Você deve escrever \d "user"
. O mesmo problema surge com distinção entre maiúsculas e minúsculas onde \d MyTable
funciona, mas SELECT * FROM MyTable
não vai funcionar, você tem que escrever SELECT * FROM "MyTable"
. Seria bom dar uma
HINT
mensagem sobre isso no erro. Infelizmente, o analisador e o planejador realmente não têm informações suficientes no momento em que o erro "coluna não existe" é gerado para saber que você escreveu originalmente uma palavra-chave, tudo o que vê é uma verificação de função nesse ponto.