sql >> Databasteknik >  >> RDS >> PostgreSQL

Kontrollera om databasen finns i PostgreSQL med hjälp av skal

Obs/uppdatering (2021):Medan det här svaret fungerar , filosofiskt håller jag med andra kommentarer om att det rätta sättet att göra detta är att fråga Postgres .

Kontrollera om de andra svaren som har psql -c eller --command i dem är en bättre passform för ditt användningsfall (t.ex. Nicholas Grillys, Nathan Osmans, bruces eller Pedros variant

Jag använder följande modifiering av Arturos lösning:

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

Vad den gör

psql -l ger något i stil med följande:

                                        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)

Att använda det naiva tillvägagångssättet innebär att sökningen efter en databas som heter "Lista, "Åtkomst" eller "rader" kommer att lyckas. Så vi skickar denna utdata genom ett gäng inbyggda kommandoradsverktyg för att bara söka i den första kolumnen.

-t flaggan tar bort sidhuvuden och sidfötter:

 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

Nästa bit, cut -d \| -f 1 delar utmatningen med det vertikala röret | tecken (rymd från skalet med ett snedstreck) och väljer fält 1. Detta lämnar:

 my_db             
 postgres          
 template0         
                   
 template1         
         

grep -w matchar hela ord och matchar därför inte om du söker efter temp i detta scenario. -q alternativet undertrycker all utdata som skrivs till skärmen, så om du vill köra detta interaktivt vid en kommandotolk kan du utesluta -q så något visas direkt.

Observera att grep -w matchar alfanumeriska, siffror och understreck, vilket är exakt den uppsättning tecken som tillåts i databasnamn utan citattecken i postgresql (bindestreck är inte lagliga i identifierare utan citattecken). Om du använder andra tecken, grep -w fungerar inte för dig.

Exitstatusen för hela denna pipeline kommer att vara 0 (framgång) om databasen finns eller 1 (misslyckande) om det inte gör det. Ditt skal kommer att ställa in den speciella variabeln $? till utgångsstatus för det senaste kommandot. Du kan också testa statusen direkt i en villkorlig:

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


  1. PostgreSQL 9.3:Dynamisk pivottabell

  2. Hur får man exportutdata i riktigt CSV-format i SQL Server Management Studio?

  3. MySQL datumformat

  4. Postgres lösenordsautentisering misslyckas