SYSTEM238 / NOTES1 / データベース / psqlをカスタマイズする

NOTES1 PROG1
psqlをカスタマイズする
psqlのコマンドプロンプトを変更して複数サーバを同時進行で操作する際の間違いを減らす。

プロンプトの設定方法

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

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

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

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

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

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

user_name@db_name=#

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

しかし、複数のサーバで同時に作業をしているときなんかは、このプロンプトだとサーバの判別がつきにくいです。データベース名やスキーマ名が同じ構成のサーバを複数一緒に作業をするときとか間違えそうです。

そこでBashのコマンドプロンプトをカスタマイズするのようにサーバの色分けをします。

設定できる変数一覧

以下の変数が設定できます。あんまり長くなるとごちゃごちゃするし視認性が悪いのでホドホドで。

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

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

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

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

// %[%033[1;33m%] と [%033[0m%] にはさまれた文字が黄色になる
host:user_name@db_name=#

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

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

まとめ

私は以下のようなコマンドプロンプトにしました。

\set PROMPT1 '%[%033[0;31m%]XXX%[%033[0m%]:%n@%/=%# '
\set COMP_KEYWORD_CASE upper
host:user_name@db_name=# 
 XXX   サーバの固有ID(色分けする)
 %n  ユーザ名  
 %/  接続中のデータベース名  
 %#  ス−パーユーザなら#、それ以外なら>を表示

プロンプトには%x(トランザクションの状態)も表示してましたが、psqlを使っている最中にトランザクションの状態が判らなくなるような事がないので消しました。

COMP_KEYWORD_CASEはselectなどの予約語を入力補完した時に大文字で統一する設定です。Ver8.xのデフォルトに合わせました。

その他

「.psqlrc」の詳細はPostgreSQL9.3:psqlを参照してください。

それからあわせてBashのコマンドプロンプトをカスタマイズするもどうぞ。

参考

PostgreSQL全機能バイブル

ちょっとした事はググって対応できますが、もうちょっと踏み込んだところの情報は本書以上にまとまっているものは無いと思います。

PostgreSQLのリファレンス本はこの本を入手しておけば間違いないと思います。お薦めです!!