psqlのコマンドプロンプトをカスタマイズする

psqlのコマンドプロンプトを工夫して作業中のサーバを間違えないようにする。

1. プロンプトの設定方法

標準のプロンプトでは接続中のデータベースしか表示しません。これだとスキーマを使って同一データベース内を分割して運用していると接続中のユーザ(スキーマ)がわからず不便です。

そこで、プロンプトに接続中のユーザ(スキーマ)@データベースを表示することにします。

ホームディレクトリに下記の内容の「.psqlrc」作成してください。


\set PROMPT1 '%n@%/=%#'

 %n  ユーザ名
 %/  接続中のデータベース名
 %#  ス−パーユーザなら#、それ以外なら>を表示

この設定で、以下のようなコマンドプロンプトが表示されます。


ユーザ@DB名=>
ユーザ@DB名=> \copyright
PostgreSQL Database Management System
(formerly known as Postgres, then as Postgres95)
  :
  :
ユーザ@DB名=>

接続中のユーザ/データベースがわかるようになりました。

しかし、複数のサーバで同時作業をしているときなんかは、このプロンプトだとサーバの判別がつきにくいことがあります。特に「データベース名とスキーマ名が同じ複数サーバで同時に作業」をしているときなんかは最悪です。

このノートでは、そんな環境での間違いを減らすコマンドプロンプトを考えます。

2. 設定できる変数一覧

以下の変数が設定できます。あんまり長くなるとごちゃごちゃするし視認性が悪いのでホドホドで。それと、変数でなくサーバごとに固有値を直書きするのもアリだと思います。


%M  データベースサーバの完全なホスト名(Unixドメインソケットの場合は[local])
%m  最初の.までのデータベースサーバのホスト名(Unixドメインソケットの場合は[local])
%>  データベースサーバが監視するポート番号
%n  データベースセッションユーザの名前
%/  接続中のデータベース名
%~  デフォルトデータベースの場合~を表示、あとは%/と同じ
%#  データベーススーパーユーザは#、それ以外の場合は>
%x  トランザクションの状態(トランザクション外は空文字列、中は*、失敗は!、不定は?)
%:name:  psqlのname変数の値
%`command`  通常の"逆引用符"による置き換えに似たcommand出力
%[ ... %]   プロンプトには端末制御文字を含めることができる

3. 変数だけじゃなく色もつけられる

文字だけだとどうしても埋もれてしまうので色分けします。実行結果と入力行の判別も付きやすくなります。


\set PROMPT1 '%[%033[1;31m%]%m[%033[0m%]:%n@%/=%# '

// %[%033[1;31m%] と [%033[0m%] にはさまれた文字が赤色になる


host:user_name@db_name=#

「1;31」の部分を変更すると他の色にできます。


0;30  Black
0;34  Blue
0;32  Green
0;36  Cyan
0;31  Red
0;35  Purple
0;37  Light Gray
1;30  Dark Gray
1;34  Light Blue
1;32  Light Green
1;36  Light Cyan
1;31  Light Red
1;35  Light Purple
1;33  Yellow
1;37  White

4. 結論(ぼくのかんがえたさいきょうプロンプト)

以下のような.psqlrcにしました。


\set PROMPT1 '%[%033[1;31m%]XXX%[%033[0m%]:%n@%/=%# '
\set COMP_KEYWORD_CASE upper


XXX:user_name@db_name=>

 XXX   サーバの固有ID(色分けする)
 %n  ユーザ名
 %/  接続中のデータベース名
 %#  ス−パーユーザなら#、それ以外なら>を表示

ホスト名を使わずサーバ固有IDを文字列で指定したのは、冒頭に述べたように同じホスト名があるのと「そもそもホスト名でサーバを呼ぶ事があまりなく、お客さんの名前とかシステムの名前で呼ぶ事の方が多い」からです。
「鈴木建設のDBサーバ」とか「顧客管理システムのwebサーバ」とかです。

例)鈴木建設のDBサーバと斉藤商事のDBサーバだとこんな感じです。


SUZU-DB:user_name@db_name=>\copyright
PostgreSQL Database Management System
(formerly known as Postgres, then as Postgres95)
  :
  :
SUZU-DB:user_name@db_name=>


SAIT-DB::user_name@db_name=>\h ABORT
コマンド:    ABORT
説明: 現在のトランザクションを中止します
書式:
ABORT [ WORK | TRANSACTION ]

SAIT-DB::user_name@db_name=>

5. 参考

https://www.postgresql.jp/document/9.3/html/app-psql.html#APP-PSQL-PROMPTING