Tecnología · GUÍA PRÁCTICA
¿PostgreSQL dice relation does not exist? Identifica la sesión antes de cambiar search_path
SQLSTATE 42P01 suele indicar que la aplicación y la consola resuelven nombres en otra base, esquema o sesión. Ejecuta sondas de solo lectura en la conexión que falla y corrige únicamente la rama probada.

Una tabla puede verse en pgAdmin o psql y aun así fallar en la aplicación. La pregunta útil es qué servidor, base, rol, search path y ortografía utilizó la sesión fallida.
No empieces recreando la tabla, cambiando search_path globalmente ni concediendo permisos amplios. Conserva el error y SQLSTATE y toma una huella de solo lectura en la conexión original.
Captura la sesión exacta que falla
En el mismo pool, transacción y rol registra base, dirección y puerto, usuarios, rol, search_path y current_schemas(true).
Guarda literalmente el token, comillas, esquema y SQLSTATE; toma la misma huella en la consola administrativa.
Resuelve el nombre sin cambiar estado
Usa to_regclass con el nombre no cualificado y el esperado con esquema; consulta pg_class y pg_namespace para tipo, persistencia y visibilidad.
Si ambos son NULL y el catálogo no coincide, revisa base equivocada, migración no aplicada o revertida, objeto borrado o temporal de otra sesión.
Separa mayúsculas, visibilidad y privilegios
Compara la ortografía del catálogo. Un objeto "Orders" exige comillas y mayúsculas exactas.
Si existe cualificado pero falla el acceso, revisa USAGE del esquema, permiso de tabla y reglas de exposición API por separado.
Compara la sesión de migración o administración
Ejecuta la misma huella dentro de la herramienta o transacción de migración y compara endpoint, base, rol y esquemas.
Un CREATE sin commit, migración fallida, otro tenant o tabla temporal no se arreglan cambiando search_path.
Aplica una corrección estrecha y demuéstrala
Para un objeto estable usa nombre cualificado. Si el lookup no cualificado es intencional, revisa rol o inicialización y reconecta el pool.
Coordina renombres y concede solo lo necesario; no recrees la tabla antes de probar el destino. Verifica desde una conexión nueva de la aplicación.
