Error de PostgreSQL: role does not exist
FATAL: role "ubuntu" does not exist
El nombre de usuario que presentó la conexión no tiene un rol correspondiente en este clúster. Como su gemelo (database does not exist), esto suele ser una sorpresa de valores por defecto: ejecuta psql sin -U y presenta tu nombre de usuario del sistema operativo, que en una instalación nueva no coincide con ningún rol.
Qué significa este error
Los roles (usuarios y grupos son lo mismo en PostgreSQL) viven a nivel de clúster, compartidos por todas las bases de datos de ese servidor. Una instalación nueva tiene esencialmente un rol de login: postgres, el superusuario. Nada con el nombre de tu cuenta del SO existe hasta que alguien lo crea.
En los paquetes de Linux, las conexiones locales como el usuario del SO postgres normalmente usan autenticación peer — la identidad del SO es la credencial. Por eso sudo -u postgres psql es la ruta estándar de bootstrap.
Causas comunes
- psql sin
-Uen una máquina cuyo nombre de usuario del SO no tiene rol — el caso de manual en instalaciones nuevas e imágenes de CI. - El rol nunca se creó en este entorno (funciona en prod, falla en el portátil nuevo).
- Clúster incorrecto: el rol existe en la instancia gestionada, pero tu cadena de conexión apunta a localhost.
- Sensibilidad a mayúsculas/minúsculas: un rol creado como
"Alice"(entrecomillado) no esalice.
Cómo diagnosticarlo
# Entra como superusuario local (peer auth) y mira los roles reales:
sudo -u postgres psql -c '\du'
Si no puedes entrar de esa manera, quien administre la instancia puede ejecutar SELECT rolname FROM pg_roles;. Luego compara con el nombre exacto (y las mayúsculas/minúsculas) del mensaje de error — y comprueba dos veces que estás en el clúster que pretendías.
Cómo solucionarlo
-- El rol de aplicación típico:
CREATE ROLE app_user LOGIN PASSWORD '...';
-- O bien, para trabajar cómodo en local: un rol con tu nombre del SO
CREATE ROLE gianluca LOGIN SUPERUSER; -- solo en máquinas de desarrollo
- O simplemente conéctate como un rol existente:
psql -U postgres. - En scripts y CI, nunca dependas de los valores por defecto: pasa
-Uy-dexplícitamente.
