PostgreSQL の psql コマンドのカスタマイズ


psql コマンドのカスタマイズの必要性

PostgreSQL をコマンドライン経由で操作している場合、検索結果の表示形式は意外にも重要です。検索結果を一見して理解できることは効率面からしても非常に重要です。またさらに効率を上げるにはどうしたら良いか、あるいはどうやったらミスをなくせるかを psql コマンドをカスタマイズすることで解決してみます。




カスタマイズしない状態での psql コマンドの出力結果

通常 psql コマンドでクエリーを叩くと次のような結果が表示されますね。
=> SELECT now(), 123 + 877 AS result;
 now                          | result
------------------------------+--------
 2017-09-07 03:48:36.44548+00 | 1000
(1 row)


結果を表形式で出力

せっかくデータベーステーブルは2次元の表形式なので、結果も表形式で表示してみましょう。下記のように "\pset border 2" とすれば表形式で結果を表示できるようになります。
=> \pset border 2
Border style is 2.
=> SELECT now(), 123 + 877 AS result;
+-------------------------------+--------+
|              now              | result |
+-------------------------------+--------+
| 2017-09-07 03:49:59.069731+00 |   1000 |
+-------------------------------+--------+
(1 row)


結果をカンマ区切り(CSV)で出力

また結果をカンマ区切りの CSV で表示したい場合には次のようにすれば良いです。結果行数が少なければそのままコピーして EXCEL に貼り付ければ CSV ファイルあるいは EXCEL ファイルとして簡単に加工できるようになります。
=> \pset format unaligned
Output format is unaligned.
=> \pset fieldsep ','
Field separator is ",".
=> SELECT now(), 123 + 877 AS result;
now,result
2017-09-07 03:51:50.111011+00,1000
(1 row)


SQL の実行時間を表示

さらに SQL の実行時間も知りたい場合には次のように "\timing" というコマンドを実行しておいて SQL を実行すると所要時間を表示できます。
=> \timing
Timing is on.
=> SELECT now(), 123 + 877 AS result;
+-------------------------------+--------+
|              now              | result |
+-------------------------------+--------+
| 2017-09-07 03:54:43.864531+00 |   1000 |
+-------------------------------+--------+
(1 row)
Time: 1.320 ms


psql コマンドライン上での別名(エイリアス)の定義

またいつも psql で実行するコマンドには別名(エイリアス)を付けて、キーボードタイプ数を減らすことも出来ますね。

これは何をやっているかと言うと、"\set" というコマンドに続けて、"cnt" という別名を定義します。そして "cnt" とは何かという実体を次に記載してあげます。この場合は "SELECT COUNT(*) FROM" です。つまり "cnt" を実行すると自動的に "SELECT COUNT(*) FROM" に置き換わるわけです。

実際に定義したコマンドを利用するには、コロン(:)に続けて定義した別名を書き(":cnt")、その後にスペース1つとレコード件数を調べたいテーブル名を書くと、以下のように件数を得ることが出来ます。これを上手く使えばかなり省力化が望めます。

=> \set cnt 'SELECT COUNT(*) FROM'
=> :cnt pg_database;
+-------+
| count |
+-------+
|     7 |
+-------+
(1 row)


psql でパスワードを聞かれないようにする

PostgreSQL の設定ファイルである pg_hba.conf ファイルの設定次第ですが、psql コマンドで PostgreSQL に接続しようとすると以下のようにパスワードが聞かれますので毎回入力する必要があります。

しかしシェルスクリプト等で psql を実行しようとする場合にパスワードが聞かれてしまうと実行できなくなってしまいます。
$ psql -h remove_server -p 5432 -d testdb
Password:
そこで PGPASSWORD という環境変数を設定してあげることでパスワードが聞かれなくなります。以下は hogehoge というパスワードを PGPASSWORD 環境変数に設定しています。
$ PGPASSWORD=hogehoge psql -h remove_server -p 5432 -d testdb