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