PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Controlla se il database esiste in PostgreSQL usando la shell

Nota/aggiornamento (2021):mentre questa risposta funziona , filosoficamente sono d'accordo con altri commenti sul fatto che il modo giusto per farlo è chiedere a Postgres .

Controlla se le altre risposte che hanno psql -c o --command in essi si adattano meglio al tuo caso d'uso (ad esempio la variante di Nicholas Grilly, Nathan Osman, bruce o Pedro

Uso la seguente modifica della soluzione di Arturo:

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

Cosa fa

psql -l restituisce qualcosa di simile al seguente:

                                        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)

L'uso dell'approccio ingenuo significa che la ricerca di un database chiamato "Elenco, "Accesso" o "righe" avrà esito positivo. Quindi eseguiamo questo output tramite una serie di strumenti da riga di comando integrati per cercare solo nella prima colonna.

Il -t flag rimuove intestazioni e piè di pagina:

 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

Il bit successivo, cut -d \| -f 1 divide l'output per il tubo verticale | carattere (scappato dalla shell con una barra rovesciata) e seleziona il campo 1. Questo lascia:

 my_db             
 postgres          
 template0         
                   
 template1         
         

grep -w corrisponde a parole intere, quindi non corrisponderà se stai cercando temp in questo scenario. Il -q l'opzione sopprime qualsiasi output scritto sullo schermo, quindi se vuoi eseguirlo in modo interattivo al prompt dei comandi puoi escludere il -q quindi qualcosa viene visualizzato immediatamente.

Nota che grep -w corrisponde all'alfanumerico, alle cifre e al trattino basso, che è esattamente l'insieme di caratteri consentiti nei nomi di database senza virgolette in postgresql (i trattini non sono legali negli identificatori senza virgolette). Se stai usando altri caratteri, grep -w non funzionerà per te.

Lo stato di uscita dell'intera pipeline sarà 0 (successo) se il database esiste o 1 (fallimento) se così non fosse. La tua shell imposterà la variabile speciale $? allo stato di uscita dell'ultimo comando. Puoi anche testare lo stato direttamente in un condizionale:

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