Errore PostgreSQL: relation does not exist

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

PostgreSQL non ha trovato alcuna tabella, view o sequence con quel nome tra gli schemi in cui gli è consentito guardare. In pratica questo errore raramente significa che la tabella manca — di solito significa che tu e PostgreSQL state guardando in posti diversi.

Cosa significa questo errore

"Relation" è il termine ombrello di PostgreSQL per tabelle, view, sequence, indici e affini. La risoluzione dei nomi dipende da due elementi di contesto che le persone dimenticano di avere: il database corrente (le relation vivono per-database; non esiste accesso cross-database) e la search_path, la lista ordinata di schemi rispetto a cui un nome non qualificato viene risolto.

Più una regola di sintassi che genera confusione senza fine: gli identificatori non quotati vengono convertiti in minuscolo. Una tabella creata come "Users" (quotata, da un ORM o una GUI) può essere raggiunta solo come "Users" — il nome non quotato users è un identificatore diverso.

Cause comuni

Come diagnosticarlo

SELECT current_database();
SHOW search_path;

-- La relation esiste da qualche parte, sotto qualunque case?
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%';

Quest'ultima query risolve tutto in un colpo: ti dice se la relation esiste affatto, in quale schema e con quale case esatto.

Come risolverlo