1. ホーム
  2. postgresql

[解決済み] PostgreSQLにデータベースが存在するかどうかをシェルで確認する

2022-04-26 20:35:03

質問

PostgreSQLのデータベースが存在するかどうかを確認するためにシェルを使用することが可能かどうかについて、どなたか教えていただけないでしょうか?

シェルスクリプトを作っていて、データベースがまだ存在しない場合のみ作成させたいのですが、今までどのように実装すればいいのかわかりませんでした。

どのように解決しますか?

注・更新(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)

素朴な方法では、"List、"Access"、または"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