sql >> Databáze >  >> RDS >> PostgreSQL

Zkontrolujte, zda databáze v PostgreSQL existuje pomocí shellu

Poznámka/aktualizace (2021):Zatímco tato odpověď funguje , filozoficky souhlasím s ostatními komentáři, že správný způsob, jak to udělat, je zeptat se Postgres .

Zkontrolujte, zda ostatní odpovědi mají psql -c nebo --command v nich se lépe hodí pro váš případ použití (např. varianta Nicholas Grilly, Nathan Osman, Bruce nebo Pedro

Používám následující modifikaci Arturoova řešení:

psql -lqt | řez -d \| -f 1 | grep -qw

Co to dělá

psql -l vypíše něco jako následující:

                                        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)

Použití naivního přístupu znamená, že hledání databáze nazvané „Seznam, „Přístup“ nebo „řádky“ bude úspěšné. Tento výstup jsme tedy propojili řadou vestavěných nástrojů příkazového řádku, abychom vyhledávali pouze v prvním sloupci.

-t flag odstraní záhlaví a zápatí:

 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

Další bit, cut -d \| -f 1 rozdělí výstup svislou čárou | znak (uniklý z shellu pomocí zpětného lomítka) a vybere pole 1. Zůstane:

 my_db             
 postgres          
 template0         
                   
 template1         
         

grep -w odpovídá celým slovům, a proto se nebude shodovat, pokud hledáte temp v tomto scénáři. -q volba potlačí jakýkoli výstup zapsaný na obrazovku, takže pokud to chcete spustit interaktivně na příkazovém řádku, můžete vyloučit -q takže se něco okamžitě zobrazí.

Všimněte si, že grep -w odpovídá alfanumerickým znakům, číslicím a podtržítku, což je přesně sada znaků povolených v názvech databází neuvedených v uvozovkách v postgresql (pomlčky nejsou povoleny v identifikátorech bez uvozovek). Pokud používáte jiné znaky, grep -w nebude pro vás fungovat.

Stav ukončení celého tohoto kanálu bude 0 (úspěch), pokud databáze existuje, nebo 1 (selhání), pokud ne. Váš shell nastaví speciální proměnnou $? do výstupního stavu posledního příkazu. Stav můžete také otestovat přímo v podmíněném:

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


  1. Získejte názvy tabulek pomocí příkazu SELECT v MySQL

  2. Jak funguje SQLite Min()

  3. Zachycení počtu z dotazu SQL

  4. Jak napsat dotaz, který dělá něco podobného jako GROUP_CONCAT MySQL v Oracle?