PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Verifique se o banco de dados existe no PostgreSQL usando shell


Observação/atualização (2021):enquanto esta resposta funciona , filosoficamente concordo com outros comentários de que a maneira correta de fazer isso é perguntar ao Postgres .

Verifique se as outras respostas que possuem psql -c ou --command neles são mais adequados para o seu caso de uso (por exemplo, a variante de Nicholas Grilly, Nathan Osman, bruce ou Pedro

Eu uso a seguinte modificação da solução de Arturo:

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

O que faz


psql -l emite algo como o seguinte:
                                        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)

Usar a abordagem ingênua significa que a busca por um banco de dados chamado "Lista, "Acesso" ou "linhas" será bem-sucedida. Assim, canalizamos essa saída por meio de várias ferramentas de linha de comando integradas para pesquisar apenas na primeira coluna.

O -t flag remove cabeçalhos e rodapés:
 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

O próximo bit, cut -d \| -f 1 divide a saída pelo tubo vertical | caractere (escapado do shell com uma barra invertida) e seleciona o campo 1. Isso deixa:
 my_db             
 postgres          
 template0         
                   
 template1         
         

grep -w corresponde a palavras inteiras e, portanto, não corresponderá se você estiver procurando por temp Neste cenário. O -q A opção suprime qualquer saída gravada na tela, portanto, se você quiser executar isso interativamente em um prompt de comando, poderá excluir o -q para que algo seja exibido imediatamente.

Observe que grep -w corresponde a alfanuméricos, dígitos e sublinhado, que é exatamente o conjunto de caracteres permitidos em nomes de banco de dados sem aspas no postgresql (hífens não são válidos em identificadores sem aspas). Se você estiver usando outros caracteres, grep -w não vai funcionar para você.

O status de saída de todo esse pipeline será 0 (sucesso) se o banco de dados existir ou 1 (falha) se isso não acontecer. Seu shell irá definir a variável especial $? para o status de saída do último comando. Você também pode testar o status diretamente em uma condicional:
if psql -lqt | cut -d \| -f 1 | grep -qw <db_name>; then
    # database exists
    # $? is 0
else
    # ruh-roh
    # $? is 1
fi