結果が1行1列のみの場合

psqlコマンドでクエリを実行した結果をシェルスクリプトで利用するには、-qtAオプションを指定すると扱いやすくなる。

$ psql -qtA -U 接続ユーザ -d データベース名 -c "クエリ(SQL)"

例えばcount(*)で集計した結果は以下のような出力となる

$ psql -qtA -U postgres -d sampledb -c "SELECT count(*) FROM users"
4

カラム名や(行数)などの余計な情報がなくクエリの結果だけが出力されるためシェルスクリプトで扱いやすくなる。

シェルスクリプトでクエリの結果を変数に格納するには以下のようにする。

RESULT=$(psql -qtAX -U postgres -d sampledb -c "SELECT count(*) FROM users")
echo $RESULT

各オプションの意味は以下のとおり。

  • -q: メッセージを抑制し、クエリの結果のみを表示する
  • -t: 行のみを表示し、ヘッダ(カラム名の行)やフッタ(行数表示)を表示しない
  • -A: 整列せずすべて左寄せで表示する

結果が複数行または複数列の場合

結果が複数行または複数列の場合は-Fオプションを指定して区切り文字を指定する。

$ psql -qtA -F, -U postgres -d sampledb -c "SELECT * FROM users"
1,taro,,,
2,jiro,,,
3,sabu,,,
4,shiro,,,

-Fオプションで指定した区切り文字はシェルスクリプトでcutコマンドなどで分割して利用できる。

$ psql -qtA -F, -U postgres -d sampledb -c "SELECT * FROM users" | cut -d, -f2
taro
jiro
sabu
shiro

各オプションの詳細

-tオプション

-tオプションを指定しない場合、クエリの結果にヘッダ(カラム名の行)やフッタ(行数表示)が含まれる。

-tオプションを指定しない場合は以下のような出力となる。

$ psql -U postgres -d sampledb -c "SELECT count(*) FROM users"
  count
-------
     4
(1 row)

-tオプションを指定すると以下のようにヘッダやフッタが表示されない。

$ psql -t -U postgres -d sampledb -c "SELECT count(*) FROM users"
4

-Aオプション

-Aオプションは整列せずすべて左寄せで表示する。

-Aオプションを指定しない場合は以下のような出力となる。

$ psql -U postgres -d sampledb -c "SELECT * FROM users"
 id | name | email | address
----+------+-------+---------
  1 | taro |       | 
  2 | jiro |       | 
  3 | sabu |       | 
  4 | shiro|       |

-Aオプションを指定すると以下のように整列せずすべて左寄せで表示される。

$ psql -A -U postgres -d sampledb -c "SELECT * FROM users"
id|name|email|address
1|taro|||
2|jiro|||
3|sabu|||
4|shiro|||
(4 rows)

-Fオプション

-Fオプションは区切り文字を指定する。

-Fオプションを指定しない場合は|で区切られる。

$ psql -qtA -U postgres -d sampledb -c "SELECT * FROM users"
1|taro|||
2|jiro|||
3|sabu|||
4|shiro|||

-Fオプションを指定すると区切り文字を指定できる。

$ psql -qtA -F, -U postgres -d sampledb -c "SELECT * FROM users"
1,taro,,,
2,jiro,,,
3,sabu,,,
4,shiro,,,