user
je vyhrazené slovo
. Je to alias pro current_user
.
regress=> SELECT * FROM user;
current_user
--------------
myusername
(1 row)
Pokud chcete použít user
jako název tabulky, protože se jedná o vyhrazené slovo, musíte uvést identifikátor , např.:
SELECT id FROM "user";
Váš ORM by měl uvádět všechny identifikátory nebo alespoň vyhrazená slova. Pokud tak neučiníte, jedná se o chybu ve vašem ORM. Chybu ORM můžete obejít použitím nerezervovaného slova jako názvu tabulky.
Myslím, že v psql
je to trochu bradavice že automaticky uvádí identifikátory, které předáváte příkazům zpětného lomítka. Takže \d user
bude fungovat, ale select * from user
zvyklý. Měli byste napsat \d "user"
. Stejný problém nastává s rozlišováním malých a velkých písmen, kde \d MyTable
funguje, ale SELECT * FROM MyTable
nebude fungovat, musíte napsat SELECT * FROM "MyTable"
.
Bylo by hezké dát HINT
zpráva o tom v chybě. Bohužel analyzátor a plánovač ve skutečnosti nemají dostatek informací v okamžiku, kdy se vygeneruje chyba „sloupec neexistuje“, aby věděl, že jste původně napsali klíčové slovo, v tomto okamžiku vidí pouze sken funkce.