Windowsのコマンドプロンプト上でPostgreSQLのDBリストを取得する

pgAdminを使うとGUI上でDB一覧を見ることができますが、バッチ処理などで使いたい場合文字列で引き出す方が利便性が高いです。コマンドプロンプトを使ってデータベースのリストを文字列出力します。

psqlからデータベース一覧を取得する

PATHは通していることを前提にしています。コマンドプロンプト上でpsqlを使いデータベースに入ります。

psql -U postgres -d postgres

Windows環境の場合はコマンドプロンプト上のログインユーザ=Windowsセッションのログインユーザになっているので -U でユーザ名:postgres を指定します。-d postgres でpostgresという名前のデータベースに入ってます。パスワードを求められるのでちゃちゃっと入力。

postgresに入ったあとで \l を入力するとデータベース一覧が取得できます。

f:id:kazutaka83:20170726231025p:plain

しかし欲しいものはこれではありません。他のプログラムに渡しやすい形にしたいのです。

標準出力でデータベース一覧を出力する

先ほどのやり方だと①psqlでDBに入る ②psql上で一覧を取得する という段階を踏みました。ここでは ①の工程を省く方法を考えます。PostgreSQLはpostgresデータベースのpg_databaseというテーブル内にデータベース一覧を持っています。したがって以下のクエリでデータベース情報を取得することができます。

SELECT * FROM pg_database;

実際に動かすと以下のような出力が得られます。

f:id:kazutaka83:20170726231759p:plain

これを見るとdatnameのフィールドにデータベース名が入っているようなので、そこだけ出るようにクエリを書き直します。

SELECT datname FROM pg_database;

出力イメージ

f:id:kazutaka83:20170726231922p:plain

psqlログインの部分とクエリをまとめてしまいます。

psql -U postgres -d postgres -c "SECECT datname FROM pg_database;"

これで標準出力にクエリの結果が出てきました。

f:id:kazutaka83:20170726232506p:plain

余分な部分を取り除く

psqlのオプションを使って余分な部分を取り除きます。-t オプションで余分なフッタ部分(列数とか)を消せます。今回は-tオプションだけでも十分ですが、メッセージ出力を止める -q も併用すると事故が起きにくくなります。

psql -U postgres -d postgres -q -t -c "SECECT datname FROM pg_database;"

出力イメージ

f:id:kazutaka83:20170726233123p:plain

以下のようなリダイレクトを噛ませるとデータベース一覧をテキストファイルに出力することができます。

psql -U postgres -d postgres -q -t -c "SECECT datname FROM pg_database;" > dblist.txt

スポンサード リンク