PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Überprüfen Sie mithilfe der Shell, ob die Datenbank in PostgreSQL vorhanden ist

Hinweis/Update (2021):Während diese Antwort funktioniert , philosophisch gesehen stimme ich anderen Kommentaren zu, dass der richtige Weg, dies zu tun, darin besteht, Postgres zu fragen .

Überprüfen Sie, ob die anderen Antworten psql -c enthalten oder --command darin besser zu Ihrem Anwendungsfall passen (z. B. die Variante von Nicholas Grilly, Nathan Osman, Bruce oder Pedro

Ich verwende die folgende Modifikation von Arturos Lösung:

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

Was es tut

psql -l gibt etwa Folgendes aus:

                                        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)

Die Verwendung des naiven Ansatzes bedeutet, dass die Suche nach einer Datenbank namens „List“, „Access“ oder „rows“ erfolgreich sein wird. Also leiten wir diese Ausgabe durch eine Reihe von integrierten Befehlszeilentools, um nur in der ersten Spalte zu suchen.

Das -t Flag entfernt Kopf- und Fußzeilen:

 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

Das nächste Bit, cut -d \| -f 1 teilt die Ausgabe durch den senkrechten senkrechten Strich | Zeichen (von der Shell mit einem Backslash maskiert) und wählt Feld 1 aus. Dies hinterlässt:

 my_db             
 postgres          
 template0         
                   
 template1         
         

grep -w stimmt mit ganzen Wörtern überein und wird daher nicht übereinstimmen, wenn Sie nach temp suchen In diesem Szenario. Das -q Die Option unterdrückt jegliche Ausgabe, die auf den Bildschirm geschrieben wird. Wenn Sie diese also interaktiv an einer Eingabeaufforderung ausführen möchten, können Sie -q ausschließen also wird sofort etwas angezeigt.

Beachten Sie, dass grep -w stimmt mit alphanumerischen Zeichen, Ziffern und dem Unterstrich überein, was genau der Satz von Zeichen ist, die in Datenbanknamen ohne Anführungszeichen in postgresql zulässig sind (Bindestriche sind in Bezeichnern ohne Anführungszeichen nicht zulässig). Wenn Sie andere Zeichen verwenden, grep -w wird für Sie nicht funktionieren.

Der Exit-Status dieser gesamten Pipeline ist 0 (Erfolg), wenn die Datenbank existiert oder 1 (Fehler), wenn nicht. Ihre Shell wird die spezielle Variable $? setzen zum Exit-Status des letzten Befehls. Sie können den Status auch direkt in einer Bedingung testen:

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