PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Sprawdź, czy baza danych istnieje w PostgreSQL za pomocą powłoki

Uwaga/aktualizacja (2021):chociaż ta odpowiedź działa , filozoficznie zgadzam się z innymi komentarzami, że właściwym sposobem na zrobienie tego jest zapytanie Postgresa .

Sprawdź, czy inne odpowiedzi, które mają psql -c lub --command w nich lepiej pasują do twojego przypadku użycia (np. wariant Nicholasa Grilly'ego, Nathana Osmana, bruce'a lub Pedro

Używam następującej modyfikacji rozwiązania Arturo:

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

Co robi

psql -l wyświetla coś takiego:

                                        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)

Korzystanie z naiwnego podejścia oznacza, że ​​wyszukiwanie bazy danych o nazwie „Lista, „Dostęp” lub „wiersze” zakończy się sukcesem. Dlatego przesyłamy to wyjście przez szereg wbudowanych narzędzi wiersza poleceń, aby przeszukiwać tylko pierwszą kolumnę.

-t flaga usuwa nagłówki i stopki:

 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

Następny bit, cut -d \| -f 1 dzieli wynik na pionową rurkę | znak (uciekł z powłoki z odwrotnym ukośnikiem) i wybiera pole 1. Zostaje:

 my_db             
 postgres          
 template0         
                   
 template1         
         

grep -w dopasowuje całe słowa, więc nie będzie pasować, jeśli szukasz temp w tym scenariuszu. -q opcja wyłącza wszelkie dane wyjściowe zapisywane na ekranie, więc jeśli chcesz uruchomić to interaktywnie w wierszu poleceń, możesz wykluczyć -q więc coś zostaje natychmiast wyświetlone.

Zauważ, że grep -w dopasowuje znaki alfanumeryczne, cyfry i podkreślenie, które jest dokładnie zbiorem znaków dozwolonym w niecytowanych nazwach baz danych w postgresql (łączniki nie są dozwolone w niecytowanych identyfikatorach). Jeśli używasz innych znaków, grep -w nie zadziała dla Ciebie.

Status wyjścia tego całego potoku to 0 (sukces), jeśli baza danych istnieje lub 1 (niepowodzenie), jeśli nie. Twoja powłoka ustawi specjalną zmienną $? do statusu zakończenia ostatniego polecenia. Możesz również przetestować status bezpośrednio w trybie warunkowym:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nowe funkcje zgodności z Oracle w PostgresPlus Advanced Server 9.3Beta

  2. ECONNREFUSED dla Postgres na nodeJS z dokerami

  3. org.hibernate.internal.util.config.ConfigurationException:nie można zlokalizować zasobu cfg.xml [/HibernateTest/src/hibernate.cfg.xml]

  4. Jak przekonwertować wielkość liter w PostgreSQL

  5. Jak używać jpa danych wiosennych do zapytania kolumny jsonb?