sql >> Database >  >> RDS >> PostgreSQL

Controleer of de database bestaat in PostgreSQL met behulp van shell

Opmerking/update (2021):Terwijl dit antwoord werkt , filosofisch ben ik het eens met andere opmerkingen dat de juiste manier om dit te doen is om het Postgres te vragen .

Controleer of de andere antwoorden met psql -c of --command daarin passen beter bij uw gebruikssituatie (bijv. Nicholas Grilly's, Nathan Osman's, Bruce's of Pedro's variant

Ik gebruik de volgende wijziging van Arturo's oplossing:

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

Wat het doet

psql -l geeft zoiets als het volgende weer:

                                        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)

Het gebruik van de naïeve benadering betekent dat het zoeken naar een database met de naam "Lijst, "Toegang" of "rijen" zal slagen. Dus we sturen deze uitvoer door een aantal ingebouwde opdrachtregelprogramma's om alleen in de eerste kolom te zoeken.

De -t vlag verwijdert kop- en voetteksten:

 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

Het volgende bit, cut -d \| -f 1 splitst de uitvoer door de verticale pijp | teken (uit de shell ontsnapt met een backslash), en selecteert veld 1. Dit laat:

 my_db             
 postgres          
 template0         
                   
 template1         
         

grep -w komt overeen met hele woorden, en komt dus niet overeen als u zoekt naar temp in dit scenario. De -q optie onderdrukt elke uitvoer die naar het scherm wordt geschreven, dus als u dit interactief wilt uitvoeren bij een opdrachtprompt, kunt u de -q uitsluiten dus er wordt meteen iets weergegeven.

Merk op dat grep -w komt overeen met alfanumeriek, cijfers en het onderstrepingsteken, wat precies de reeks tekens is die is toegestaan ​​in niet-geciteerde databasenamen in postgresql (koppeltekens zijn niet legaal in niet-geciteerde identifiers). Als u andere tekens gebruikt, grep -w werkt niet voor jou.

De exit-status van deze hele pijplijn is 0 (succes) als de database bestaat of 1 (falen) als dat niet het geval is. Je shell zal de speciale variabele $? . instellen naar de exit-status van de laatste opdracht. U kunt de status ook rechtstreeks in een voorwaardelijke test testen:

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


  1. Waar u op moet letten als uw PostgreSQL-replicatie achterblijft

  2. Fout ORA-65048 bij het wijzigen van het gebruikerswachtwoord in de containerdatabase (CDB)

  3. OdbcConnection retourneert Chinese karakters als ?

  4. Oracle-gegevensbronconfiguratie voor Spring