PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Vérifier si la base de données existe dans PostgreSQL à l'aide du shell

Remarque/Mise à jour (2021) :Bien que cette réponse fonctionne , philosophiquement, je suis d'accord avec les autres commentaires que la bonne façon de faire est de demander à Postgres .

Vérifiez si les autres réponses qui ont psql -c ou --command ils sont mieux adaptés à votre cas d'utilisation (par exemple, la variante de Nicholas Grilly, Nathan Osman, bruce ou Pedro

J'utilise la modification suivante de la solution d'Arturo :

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

Ce qu'il fait

psql -l affiche quelque chose comme ceci :

                                        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'utilisation de l'approche naïve signifie que la recherche d'une base de données appelée "Liste, "Accès" ou "lignes" réussira. Nous dirigeons donc cette sortie via un ensemble d'outils de ligne de commande intégrés pour rechercher uniquement dans la première colonne.

Le -t flag supprime les en-têtes et pieds de page :

 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

Le bit suivant, cut -d \| -f 1 divise la sortie par le tuyau vertical | caractère (échappé du shell avec une barre oblique inverse) et sélectionne le champ 1. Cela laisse :

 my_db             
 postgres          
 template0         
                   
 template1         
         

grep -w correspond à des mots entiers et ne correspondra donc pas si vous recherchez temp dans ce scénario. Le -q L'option supprime toute sortie écrite à l'écran, donc si vous voulez l'exécuter de manière interactive à une invite de commande, vous pouvez exclure le -q donc quelque chose s'affiche immédiatement.

Notez que grep -w correspond à l'alphanumérique, aux chiffres et au trait de soulignement, qui est exactement l'ensemble de caractères autorisés dans les noms de base de données sans guillemets dans postgresql (les traits d'union ne sont pas autorisés dans les identifiants sans guillemets). Si vous utilisez d'autres caractères, grep -w ne fonctionnera pas pour vous.

Le statut de sortie de l'ensemble de ce pipeline sera 0 (succès) si la base existe ou 1 (échec) si ce n'est pas le cas. Votre shell définira la variable spéciale $? à l'état de sortie de la dernière commande. Vous pouvez également tester le statut directement dans un conditionnel :

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