El Cliente psql
psql parece un simple prompt de terminal, pero está haciendo más trabajo del que aparenta.
Busca en todas las páginas de la documentación
psql parece un simple prompt de terminal, pero está haciendo más trabajo del que aparenta.
Debajo de cada \dt o \d+ hay una consulta SQL ordinaria contra los catálogos del sistema de PostgreSQL, disfrazada de un atajo conveniente.
psql es un cliente SQL ligero que añade una capa de meta-comandos, cada uno de los cuales es en realidad una consulta de catálogo disfrazada.\dt respeta tu search_path, por qué el formato de salida es una preocupación del cliente y por qué los scripts de psql se comportan de manera diferente al código de aplicación.search_path, modo no interactivo.psql es el cliente de línea de comandos oficial de PostgreSQL y, en su núcleo, hace una cosa: abre una conexión y envía cualquier texto que escribas al servidor como una sentencia SQL.
La parte que lo hace sentir como algo más que un prompt SQL en bruto es su conjunto de meta-comandos, los atajos prefijados con barra invertida como \dt, \d+ y \du.
Cada uno de esos meta-comandos es implementado por psql mismo, no por el servidor, y cada uno funciona generando y ejecutando una consulta SQL contra los catálogos del sistema de PostgreSQL en tu nombre.
\dt es realmente solo una forma más amigable de pedirle a pg_catalog qué tablas existen en los esquemas de tu search_path actual.
Ese único hecho explica mucho del comportamiento de psql a la vez: los meta-comandos respetan el mismo search_path y los mismos permisos que tiene tu rol de inicio de sesión, porque en el fondo son consultas ordinarias y verificadas por permisos.
Un modelo mental útil es un traductor parado a tu lado en un mostrador de referencia: tú haces una pregunta corta en lenguaje claro, el traductor la convierte en la búsqueda exacta en el catálogo que el bibliotecario (el servidor) realmente entiende, y te devuelve la respuesta formateada para leer.
Dos estados son importantes en cada sesión de psql, y mantenerlos separados evita mucha confusión: estado del lado del cliente y estado del lado del servidor.
El estado del lado del cliente reside completamente dentro del proceso psql en ejecución e incluye cosas como tu formato de salida \pset, \timing, y cualquier variable \set que hayas definido.
El estado del lado del servidor reside en la conexión misma e incluye tu estado de transacción actual, tu search_path, y cualquier GUC a nivel de sesión que hayas establecido con SET.
Reconectarse con \c inicia una sesión completamente nueva del lado del servidor, por lo que los GUC de sesión establecidos con SET simple no sobreviven a un \c, mientras que tus configuraciones \pset del lado del cliente sí lo hacen.
-- Lado del cliente: elección de formato, reside solo en este proceso de psql
\x on
\timing on
-- Lado del servidor: parte de la sesión real de la base de datos
SET search_path = app, public;
BEGIN READ ONLY;Esa división cliente/servidor también es la razón por la que scriptar psql para CI o trabajos cron requiere una mentalidad diferente a la de escribir interactivamente: un script no tiene a un humano observando el prompt para notar una transacción pendiente o una base de datos incorrecta, por lo que cada suposición que un humano captaría a simple vista debe hacerse explícita en su lugar.
El modo no interactivo, ingresado con -f para un archivo de script o -c para un solo comando, deshabilita la mayoría de las conveniencias que hacen que el uso interactivo sea indulgente, como la invocación automática de paginador y las indicaciones de confirmación.
Meta-comandos de formato de salida como \a (no alineado), \t (solo tuplas) y \pset footer off existen específicamente para hacer que psql sea utilizable como un "data-pipe" en scripts de shell, convirtiendo lo que parece una herramienta interactiva en una pieza legítima de herramientas de automatización.
Esa doble identidad, REPL humano y cliente scriptable, es también donde comienza la mayor parte del mal uso de psql en producción, porque los hábitos que son inofensivos cuando una persona observa una terminal se vuelven peligrosos una vez que los mismos comandos se ejecutan sin supervisión.
Conectarse como un rol con acceso de escritura sin restricciones "solo para ejecutar una consulta rápida" es la forma más común en que las sesiones de psql causan incidentes, ya que un error tipográfico en una cláusula WHERE no tiene una pausa humana para capturarlo antes de que se confirme.
BEGIN READ ONLY y roles dedicados de solo lectura existen precisamente para hacer que ese error sea estructuralmente más difícil, no solo desaconsejado procesalmente.
Herramientas GUI como pgAdmin y DBeaver se basan en el mismo protocolo subyacente que usa psql, pero cambian la scriptabilidad de psql por la navegación visual, lo que convierte la elección entre ellas en una decisión de flujo de trabajo en lugar de una diferencia de capacidad.
| Herramienta | Fortaleza | Debilidad | Mejor Ajuste |
|---|---|---|---|
psql (interactivo) | Rápido, ubicuo, acceso completo a catálogos con meta-comandos | Sin navegación visual; curva de memorización pronunciada para nuevos usuarios | Investigación ad hoc por personas cómodas en una terminal |
psql (scriptado, -f/-c) | Componible en pipelines de shell y CI; totalmente reproducible | Necesita barreras de protección explícitas que un humano proporcionaría de otra manera | Verificaciones de esquemas en CI, trabajos cron, ejecutores de migraciones |
| Cliente GUI (pgAdmin, DBeaver) | Navegación visual del esquema; más fácil para compañeros de equipo con menos fluidez en SQL | Más difícil de versionar o automatizar | Equipos con habilidades mixtas, exploración de datos exploratoria |
\dt y otros comandos con barra invertida son características especiales del servidor." Son completamente conveniencias del lado del cliente; el servidor no tiene concepto de meta-comando, solo las consultas de catálogo que psql genera para ti.\c mantiene la configuración de mi sesión." \c abre una nueva sesión del lado del servidor, por lo que cualquier cosa establecida con SET (a diferencia de ALTER ROLE ... SET) se pierde, mientras que la configuración \pset del lado del cliente persiste.LIMIT por sí solo hace que una consulta exploratoria sea segura." Sin un ORDER BY, LIMIT devuelve una porción arbitraria de filas, y la consulta aún puede escanear la tabla completa para producirla.Es el cliente SQL oficial de línea de comandos de PostgreSQL, con una capa adicional de meta-comandos con barra invertida que se traducen a consultas de catálogo.
Ejecuta una consulta SQL ordinaria y verificada por permisos contra pg_catalog, limitada a tu search_path actual, y formatea el resultado para la terminal.
\dt solo muestra tablas visibles en tu search_path actual, por lo que una tabla en un esquema que no está en esa ruta no aparecerá a menos que califiques el comando, como \dt myschema.*.
El estado del lado del cliente (como el formato \pset o \timing) reside solo dentro del proceso psql en ejecución; el estado del lado del servidor (como search_path o el estado de transacción) reside en la conexión real de la base de datos.
No - \c abre una nueva sesión del lado del servidor, por lo que los valores SET a nivel de sesión se reinician; solo las configuraciones aplicadas con ALTER ROLE ... SET persisten entre reconexiones.
El modo no interactivo elimina las conveniencias destinadas a un humano en una terminal, como el paginador y algunas indicaciones, por lo que un script debe proporcionar sus propias verificaciones de seguridad explícitamente.
Solo parcialmente - LIMIT limita las filas devueltas, pero sin ORDER BY aún puede requerir escanear la tabla completa, por lo que protege la salida de tu terminal más que el trabajo del servidor.
Un rol de solo lectura hace que las escrituras accidentales sean estructuralmente imposibles en lugar de simplemente desaconsejadas, lo que es más importante en el momento en que un error tipográfico se desliza en una cláusula WHERE.
Hablan el mismo protocolo subyacente, pero psql cambia la navegación visual por la scriptabilidad, lo que lo convierte en el mejor ajuste para CI, automatización y flujos de trabajo centrados en la terminal.
\a (salida no alineada), \t (solo tuplas) y \pset footer off eliminan el formato amigable para humanos para que la salida pueda ser canalizada limpiamente a otras herramientas.
Bloquea la confirmación de cualquier sentencia de escritura dentro de esa transacción, convirtiendo una política de precaución en una garantía impuesta en lugar de algo que depende de que la persona escriba cuidadosamente.
No - una sesión de psql, como cualquier cliente, se conecta a una sola base de datos a la vez, por lo que cambiar de base de datos con \c abre una nueva conexión en lugar de agregar una segunda.
Versiones de Stack: Esta página es conceptual y describe el comportamiento del cliente
psqlconsistente en las versiones principales actuales de PostgreSQL, incluyendo PostgreSQL 18.4 (estable 18, línea de mantenimiento 17).
Revisado por Chris St. John·Última actualización: 15 jul 2026