ver usuarios postgres instalar funciona entrar desde consultas consola como cero aprender postgresql shell

usuarios - postgresql pdf



Verifique si existe una base de datos en PostgreSQL usando shell (12)

Me preguntaba si alguien podría decirme si es posible usar shell para verificar si existe una base de datos PostgreSQL.

Estoy creando un script de shell y solo quiero que cree la base de datos si aún no existe, pero hasta ahora no he podido ver cómo implementarlo.


El siguiente código de shell parece funcionar para mí:

if [ "$( psql -tAc "SELECT 1 FROM pg_database WHERE datname=''DB_NAME''" )" = ''1'' ] then echo "Database already exists" else echo "Database does not exist" fi


Estoy combinando las otras respuestas a un formulario sucinto y compatible con POSIX:

psql -lqtA | grep -q "^$DB_NAME|"

Un retorno de true ( 0 ) significa que existe.

Si sospecha que el nombre de su base de datos puede tener un carácter no estándar como $ , necesita un enfoque un poco más largo:

psql -lqtA | cut -d/| -f1 | grep -qxF "$DB_NAME"

Las opciones -t y -A aseguran de que la salida sea en bruto y no de salida "tabular" o de espacio en blanco. Las columnas están separadas por el carácter de la tubería | , entonces o el cut o el grep tiene que reconocer esto. La primera columna contiene el nombre de la base de datos.

EDITAR: grep con -x para evitar coincidencias parciales de nombres.


La share de kibibu es defectuosa porque grep -w coincidirá con cualquier nombre que contenga el patrón especificado como un componente de palabra.

es decir, si busca "foo", entonces "foo-backup" es una coincidencia.

share proporciona algunas buenas mejoras, y la versión corta funcionará correctamente para la mayoría de los casos, pero la más larga de las dos variantes ofrecidas presenta un problema similar con las subcadenas coincidentes.

Para resolver este problema, podemos usar el argumento POSIX -x para hacer coincidir solo líneas enteras del texto.

Basándose en la respuesta de Otheus, la nueva versión se ve así:

psql -U "$USER" -lqtA | cut -d/| -f1 | grep -qFx "$DBNAME"

Dicho todo esto, me inclino a decir que share en la que realmente se pregunta a postgres sobre la base de datos específica, es el mejor enfoque.


Las otras soluciones (que son fantásticas) pasan por alto el hecho de que psql puede esperar un minuto o más antes de que se agote el tiempo de espera si no se puede conectar a un host. Entonces, me gusta esta solución, que establece el tiempo de espera en 3 segundos:

PGCONNECT_TIMEOUT=3 psql development -h db -U postgres -c ""

Esto es para conectarse a una base de datos de desarrollo en la imagen oficial postgres Docker Docker.

Por otra parte, si está utilizando Rails y desea configurar una base de datos si aún no existe (como cuando se lanza un contenedor Docker), esto funciona bien, ya que las migraciones son idempotentes:

bundle exec rake db:migrate 2>/dev/null || bundle exec rake db:setup


Para completar, otra versión usa expresiones regulares en lugar de corte de cuerdas:

psql -l | grep ''^ exact_dbname/b''

Entonces, por ejemplo:

if psql -l | grep ''^ mydatabase/b'' > /dev/null ; then echo "Database exists already." exit fi


Puede crear una base de datos, si aún no existe, utilizando este método:

if [[ -z `psql -Atqc ''/list mydatabase'' postgres` ]]; then createdb mydatabase; fi


Soy nuevo en postgresql, pero el siguiente comando es lo que utilicé para verificar si existe una base de datos

if psql ${DB_NAME} -c ''/q'' 2>&1; then echo "database ${DB_NAME} exists" fi


Todavía soy bastante inexperto con la programación de shell, así que si esto es realmente incorrecto por alguna razón, vótame, pero no te alarmes demasiado.

Construyendo a partir de la respuesta de kibibu:

# If resulting string is not zero-length (not empty) then... if [[ ! -z `psql -lqt | cut -d /| -f 1 | grep -w $DB_NAME` ]]; then echo "Database $DB_NAME exists." else echo "No existing databases are named $DB_NAME." fi


Utilizo la siguiente modificación de la solución de Arturo:

psql -lqt | cut -d /| -f 1 | grep -qw <db_name>

Que hace

psql -l produce algo como lo siguiente:

List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+-----------+----------+------------+------------+----------------------- my_db | my_user | UTF8 | en_US.UTF8 | en_US.UTF8 | postgres | postgres | LATIN1 | en_US | en_US | template0 | postgres | LATIN1 | en_US | en_US | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | LATIN1 | en_US | en_US | =c/postgres + | | | | | postgres=CTc/postgres (4 rows)

Usar el enfoque ingenuo significa que la búsqueda de una base de datos llamada "Lista", "Acceso" o "filas" tendrá éxito. Por lo tanto, canalizamos esta salida a través de un conjunto de herramientas integradas de línea de comandos para buscar solo en la primera columna.

El -t elimina los encabezados y los pies de página:

my_db | my_user | UTF8 | en_US.UTF8 | en_US.UTF8 | postgres | postgres | LATIN1 | en_US | en_US | template0 | postgres | LATIN1 | en_US | en_US | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | LATIN1 | en_US | en_US | =c/postgres + | | | | | postgres=CTc/postgres

El siguiente bit, cut -d /| -f 1 cut -d /| -f 1 divide la salida por el tubo vertical | personaje (escapado del caparazón con una barra invertida), y selecciona el campo 1. Esto deja:

my_db postgres template0 template1

grep -w coincide con palabras completas, por lo que no coincidirá si está buscando temp en este escenario. La opción -q suprime cualquier resultado escrito en la pantalla, por lo que si desea ejecutar esto de forma interactiva en un símbolo del sistema, puede excluir el -q para que algo se muestre inmediatamente.

Tenga en cuenta que grep -w coincide con caracteres alfanuméricos, dígitos y el guión bajo, que es exactamente el conjunto de caracteres permitidos en los nombres de bases de datos sin comillas en postgresql (los guiones no son legales en los identificadores sin comillas). Si está usando otros caracteres, grep -w no funcionará para usted.

El estado de salida de toda esta canalización será 0 (éxito) si la base de datos existe o 1 (error) si no lo es. Tu caparazón configurará la variable especial $? al estado de salida del último comando. También puede probar el estado directamente en un condicional:

if psql -lqt | cut -d /| -f 1 | grep -qw <db_name>; then # database exists # $? is 0 else # ruh-roh # $? is 1 fi


psql -l|awk ''{print $1}''|grep -w <database>

versión corta


#!/bin/sh DB_NAME=hahahahahahaha psql -U postgres ${DB_NAME} --command="SELECT version();" >/dev/null 2>&1 RESULT=$? echo DATABASE=${DB_NAME} RESULT=${RESULT} #


postgres@desktop:~$ psql -l | grep <exact_dbname> | wc -l

Esto devolverá 1 si la base de datos especificada existe o 0 en caso contrario.

Además, si intenta crear una base de datos que ya existe, postgresql devolverá un mensaje de error como este:

postgres@desktop:~$ createdb template1 createdb: database creation failed: ERROR: database "template1" already exists