sql >> データベース >  >> RDS >> PostgreSQL

シェルを使用してデータベースがPostgreSQLに存在するかどうかを確認します

    注/更新(2021):この回答は機能します 、哲学的には、これを行う正しい方法はPostgresに質問するという他のコメントに同意します。 。

    psql -cを持つ他の回答があるかどうかを確認します または--command それらの中には、ユースケースに適しています(例:Nicholas Grilly、Nathan Osman、bruce、Pedroのバリエーション

    Arturoのソリューションの次の変更を使用します:

    psql -lqt |カット-d\| -f 1 | grep -qw

    機能

    psql -l <​​/ code> 次のようなものを出力します:

                                            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. Oracleは制約を見つけます

    2. psqlでポケットベルをカスタマイズする

    3. Oracle10gの左結合で削除

    4. Postgresに一括挿入するための最速の方法は何ですか?