Erreur PostgreSQL : relation does not exist

ERROR:  relation "users" does not exist
LINE 1: SELECT * FROM users;
                      ^

PostgreSQL n'a trouvé aucune table, vue ou séquence portant ce nom parmi les schémas où il est autorisé à chercher. En pratique cette erreur signifie rarement que la table manque — elle signifie généralement que vous et PostgreSQL cherchez à des endroits différents.

Ce que signifie cette erreur

« Relation » est le terme générique de PostgreSQL pour les tables, vues, séquences, index et consorts. La résolution des noms dépend de deux éléments de contexte qu'on oublie souvent avoir : la base de données courante (les relations vivent par base ; il n'y a pas d'accès inter-bases) et le search_path, la liste ordonnée des schémas contre lesquels un nom non qualifié est résolu.

Plus une règle de syntaxe qui génère une confusion sans fin : les identifiants sans guillemets sont repliés en minuscules. Une table créée en tant que "Users" (avec guillemets, par un ORM ou une interface graphique) ne peut jamais être atteinte que par "Users" — le nom sans guillemets users est un identifiant différent.

Causes fréquentes

Comment la diagnostiquer

SELECT current_database();
SHOW search_path;

-- La relation existe-t-elle quelque part, sous n'importe quelle casse ?
SELECT n.nspname AS schema, c.relname, c.relkind
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ILIKE '%users%';

Cette dernière requête tranche d'un coup : elle vous dit si la relation existe du tout, dans quel schéma, et avec quelle casse exacte.

Comment la corriger