sql >> Base de Datos >  >> RDS >> PostgreSQL

Compruebe si la base de datos existe en PostgreSQL usando Shell

Nota/Actualización (2021):Si bien esta respuesta funciona , filosóficamente estoy de acuerdo con otros comentarios en que la forma correcta de hacer esto es preguntarle a Postgres .

Compruebe si las otras respuestas que tienen psql -c o --command en ellos se ajustan mejor a su caso de uso (por ejemplo, la variante de Nicholas Grilly, Nathan Osman, bruce o Pedro)

Yo uso la siguiente modificación de la solución de Arturo:

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

Qué hace

psql -l genera 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)

El uso del enfoque ingenuo significa que la búsqueda de una base de datos llamada "Lista", "Acceso" o "filas" tendrá éxito. Por lo tanto, canalizamos este resultado a través de un montón de herramientas de línea de comando integradas para buscar solo en la primera columna.

El -t bandera elimina encabezados y 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 divide la salida por la tubería vertical | carácter (escapó del shell 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. El -q La opción suprime cualquier salida escrita 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 alfanuméricos, dígitos y guiones bajos, que es exactamente el conjunto de caracteres permitidos en nombres de bases de datos sin comillas en postgresql (los guiones no son legales en identificadores sin comillas). Si está utilizando 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 (fracaso) si no es así. Su shell establecerá 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