[解決済み] PostgreSQLにデータベースが存在するかどうかをシェルで確認する
質問
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
関連
-
PostgreSQLのURL解決方法
-
[解決済み] Psql はサーバーに接続できませんでした。そのようなファイルまたはディレクトリがありません、5432エラー?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] ディレクトリが存在しない場合のみmkdirする方法は?
-
[解決済み] PostgreSQLの場合。PostgreSQLのテーブルを表示する
-
[解決済み] PostgreSQLの "DESCRIBE TABLE"
-
[解決済み] PostgreSQL コマンドラインユーティリティ: psql を終了する方法
-
[解決済み] Bashシェルスクリプトの入力引数の存在確認
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Centos環境でのPostgresqlのインストールと設定、環境変数の設定Tips
-
postgresqlのjsonbデータの問い合わせと変更方法
-
サーバーに接続できませんでした:接続拒否(0x0000274D/10061)
-
[解決済み] 未知語からテキストへの変換関数の検索に失敗しました。
-
[解決済み] PostgresでInsert文のUUIDを生成する?
-
[解決済み] Postgres の全テーブルの行数を求めるには?
-
[解決済み] psqlの代替出力フォーマット
-
[解決済み] Postgresqlで「挿入無視」と「重複キー更新」(SQLマージ)をエミュレートする方法は?
-
[解決済み] PostgreSQL公式Dockerイメージの設定ファイルをカスタマイズする方法とは?
-
[解決済み] Postgresデータベースのエンコーディングの取得