PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Проверете дали базата данни съществува в PostgreSQL с помощта на shell

Забележка/актуализация (2021):Докато този отговор работи , философски съм съгласен с други коментари, че правилният начин да направите това е да попитате Postgres .

Проверете дали другите отговори, които имат psql -c или --command в тях са по-подходящи за вашия случай на употреба (напр. този на Никълъс Грили, Нейтън Осман, вариант на Брус или Педро

Използвам следната модификация на решението на Arturo:

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

Какво прави

psql -l извежда нещо като следното:

                                        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)

Използването на наивния подход означава, че търсенето на база данни, наречена „Списък, „Достъп“ или „редове“, ще успее. Затова ние предаваме този изход през куп вградени инструменти на командния ред, за да търсим само в първата колона.

-t флаг премахва горни и долни колонтитули:

 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

Следващият бит, cut -d \| -f 1 разделя изхода чрез вертикалната тръба | символ (избяга от обвивката с обратна наклонена черта) и избира поле 1. Това оставя:

 my_db             
 postgres          
 template0         
                   
 template1         
         

grep -w съвпада с цели думи и така няма да съвпада, ако търсите temp в този сценарий. -q опцията потиска всеки изход, написан на екрана, така че ако искате да стартирате това интерактивно в команден ред, можете да изключите -q така че нещо се показва незабавно.

Обърнете внимание, че grep -w съвпада с буквено-цифрови, цифри и долна черта, което е точно наборът от знаци, разрешен в имената на база данни без кавички в postgresql (тирета не са законни в идентификаторите без кавички). Ако използвате други знаци, grep -w няма да работи за вас.

Изходното състояние на целия този конвейер ще бъде 0 (успех), ако базата данни съществува или 1 (провал), ако не е така. Вашият шел ще зададе специалната променлива $? до изходното състояние на последната команда. Можете също да тествате състоянието директно в условно:

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. Oracle към PostgreSQL:ANSI външен синтаксис на присъединяване в PostgreSQL

  2. Компилиране на разширение mongo_fdw с възможност за запис в двоичен формат на инсталацията на PostgreSQL.

  3. Големите обекти не могат да се използват в режим на автоматично записване

  4. Каква е разликата между postgres и postgresql_psycopg2 като машина за база данни за django?

  5. PostgreSQL JOIN с тип масив с ред на елементите на масива, как да се приложи?