Cambiando el prompt del cliente psql

idea

El "prompt" (texto de introducción en la linea de comandos) en psql se puede cambiar y definir de una manera sencilla y rapida para adaptarlo a nuestras necesidades.

A mi por ejemplo me gusta que me indique en que servidor estoy trabajando, el usuario con el que estoy ejecutando comandos, si estoy en una transacción ó no, etc. Estos datos me ayudan mucho en mi trabajo diario y evitan que cometa errores.

Por defecto, el prompt del cliente psql solamente muestra el nombre de la base de datos que estais utilizando.


postgres@server:~$ psql 
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

postgres=# 

Para cambiar el "prompt", lo único que tenemos que hacer es actualizar el valor de la variable PROMPT1. Esta variable es la que define el "prompt" principal del cliente psql. Existen dos variables más PROMPT2 y PROMPT3 que definen otros tipos de "prompt" en determinadas circunstancias, pero en este artículo nos centraremos solamente en PROMPT1.

El valor que le demos a esta variable se muestra literalmente excepto cuando el símbolo % es usado. Dependiendo del caracter definido despues del símbolo %, se sustituirán estos por un valor u otro.

A continuación teneis los códigos que podeis usar:

%M

El nombre completo (con dominio) del servidor ejecutando la base de datos, ó [local] si estamos conectando via "Unix domain socket", ó [local:/directorio/nombre] si el socket no se encuentra en el directorio por defecto.

%m

El nombre del servidor ejecutando la base de datos ó [local] si estamos conectando via "Unix domain socket"

%>

El puerto de red utilizado por nuestra base de datos.

%n

El nombre de usuario que hemos usado para conectarnos a la base de datos. Puede cambiar durante una misma sesión si se utiliza el comando SET SESSION AUTHORIZATION

%/

Nombre de la base de datos a la que estamos conectados

%~

Como %/, pero se muestra ~ (tilde) si la base de datos a la que estamos conectados es la nuestra por defecto.

%#

Si el usuario de nuestra sesión es el administrador (postgres por defecto) se muestra el símbolo #, si no, se mostrará >. Puede cambiar durante una misma sesión si se utiliza el comando SET SESSION AUTHORIZATION

%R

Si estamos definiendo PROMPT1, mostrará normalmente el simbolo =, el símbolo ^ si estamos en modo de linea simple y el símbolo ! si la sesión es desconectada de la base de datos.

%x

Muestra el estado de la transacción. Será una cadena vacia si no estamos dentro de una transacción. El símbolo * si estamos dentro de una transacción. El símbolo ! si estamos dentro de una transacción con errores/fallos y el símbolo ? si el estado de la transacción es indeterminado.

%digits

Muestra el caracter con el valor octal definido por digits

%:name:

Muestra el valor de la variable psql con nombre "name".

%`command`

Muestra el resultado de ejecutar el comando "command"

%[ ... %]

"Prompts" pueden contener caracteres de control de terminal para cambiar el color, el fondo, el título de la ventana de nuestra terminal, etc. Estos caracteres se tienen que definir entre %[ y %]

Si quereis mostrar el símbolo % en vuestro "prompt" teneis que escribir %%

Bueno una vez que sabemos los símbolos de sustitución vamos a cambiar nuestro "prompt" en psql. En nuestro ejemplo vamos a definir uno con la siguiente información:

  • El nombre del servidor ejecutando la base de datos
  • El puerto de red utilizado por nuestra base de datos.
  • El nombre de usuario
  • Nombre de la base de datos
  • El estado de la transacción
  • ¿Somos administradores ó usuarios normales?

Para cambiar el valor de la variable PROMPT1 usamos el comando \set en psql.


postgres@server:~$ psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

postgres=# \set PROMPT1 '[%m:%>/%n@%/][%x]%# '

[[local]:5432/postgres@postgres][]# BEGIN ;
BEGIN

[[local]:5432/postgres@postgres][*]# SELECT asda;
ERROR:  column "asda" does not exist
LINE 1: SELECT asda;
               ^
[[local]:5432/postgres@postgres][!]# ROLLBACK ;
ROLLBACK

[[local]:5432/postgres@postgres][]# \c template1 
You are now connected to database "template1".

[[local]:5432/postgres@template1][]# \set PROMPT1 '%/%R%#'

template1=# \q

postgres@server:~$

Esto es todo. Si quereis evitar ejecutar el comando \set PROMPT1 cada vez que entreis de nuevo en psql, podeis definir una linea con este comando en el fichero .psqlrc en el directorio HOME del usuario que utiliceis para conectaros a PostgreSQL. Más información sobre el fichero .psqlrc en proximos artículos.