psqlのPAGERを設定する

Posted on:

psqlのPAGERを設定する

PAGERをoff/onにする

psqlでは pset値により、PAGERをon/off/alwaysにすることができます。alwaysにすると、psql起動時に出力が画面に収まっても常にPAGERが起動します。

オプションで一時的にPAGERをoffにするには以下のようにします(以降offの部分はonalwaysが指定できる)。

psql -P pager=off

.psqlrcファイルに設定すれば以後ずっとPAGERをoffになります。

\pset pager off

起動後にPAGERをoffにする(psqlで接続後に実行する)には\psetコマンドを使用します。

# \pset pager off

\pset pagerを引数なしで実行するとトグルになり、実行するとon/offが切り替わります。

# \pset pager
Pager usage is off.
# \pset pager
Pager is used for long output.

PostgreSQL 15.0からの追加機能

PostgreSQL 15.0からは、pager_min_linesが追加され、画面に収まらない場合に何行以上だったらPAGERを起動するか行数を指定できます。デフォルトは0で、画面に収まらない場合にPAGERを起動します(画面に収まる行数を指定しても無効になる)。 pager_min_linesよりもpset pager=alwaysの方が優先されます。 ターミナルのスクロール等でさかのぼれない場合のみPAGERを起動したい場合に便利です。

psql -P pager_min_lines=10000

pset値なので、.psqlrcや起動後に実行することもできます。

\pset pager_min_lines 10000
# \pset pager_min_lines 10000

psetの値は、\psetを実行すると表示されます。pagerの値はoff=0, on=1, always=2になります。

# \pset
border                   1
columns                  0
csv_fieldsep             ','
expanded                 off
fieldsep                 '|'
fieldsep_zero            off
footer                   on
format                   aligned
linestyle                ascii
null                     ''
numericlocale            off
pager                    1
pager_min_lines          10000
recordsep                '\n'
recordsep_zero           off
tableattr                
title                    
tuples_only              off
unicode_border_linestyle single
unicode_column_linestyle single
unicode_header_linestyle single

PAGERを変更する

psqlでは、PSQL_PAGER又はPAGER環境変数により、PAGERを変更することができます。PAGERは汎用的な環境変数なので、psql以外のコマンドでも使用されるのでpsqlのみに適用したい場合は、PSQL_PAGERを使用します。 PSQL_PAGERPAGER環境変数がセットされていない場合は、more又はlessがデフォルトのPAGERになる。lessがある場合は、lessが優先されます。

PSQL_PAGER=less psql

.psqlrcファイルの中で環境変数をセットできるので、以下の設定を入れると恒久的にPAGERを変更できます。

\setenv PSQL_PAGER less

PAGERの種類

psql向きのPAGERは、以下のようなものがあります。

moreは、多くの環境で入っているが、psqlのPAGERとしては使いにくいのでおすすめしません。

less

lessは古くからあるPAGERで、大抵はディストリビューションのパッケージになっているので簡単にインストールできます。 lessは、安定していて、これまで開発にそれほど変化はありませんでしたが、最近になってヘッダーオプションが追加されました。

バージョン600で、lessのヘッダーを表示するオプションが追加されたので、それ以降のバージョンであれば、以下のように設定するとpsqlのヘッダー(列名)の表示を固定できます。

PSQL_PAGER="less --header 2" psql

--header 2は、ヘッダーを2行固定表示するオプションです。--headerオプションを使用したときには、折返し表示をしないモードになります(-S相当)。

psql-less psql-less

また、--header 2,14のように、2番目の引数を渡すと2行のヘッダーの固定表示に加えて、横スクロールするときに左側を幅14まで固定表示してスクロールできます。ただ、この左側の固定はテーブルによって列の幅は変わるので、オプションで渡すのは望ましくありません。 lessで表示しているときに、--headerと入力すると入力モードに切り替わるため、そのときに文字数を入力すると、その文字数で固定表示されます。

Header lines: 2,14

ただ幅を文字数で指定する必要があるため、使いやすいとは言い難いです。

pspg

pspgはpsql用に作られたPAGERで、テーブルを表示するのに便利な機能があります。psqlの出力をアスキーテーブルの形式に変換して、列名がヘッダーとして表示されます。また、列を数字キー入力で簡単に固定表示できる(デフォルトで1が指定されているので、一番左の列が固定表示される)。

pspgはテーマがたくさん用意されていて変更できます。pspgのテーマは、pspg --themesで確認できます。

PSQL_PAGER=pspg psql

psql-pspg psql-pspg

ov

ovは拙作の汎用PAGERでpsqlでの使用を想定して開発を開始しましたが、他の用途でも使えるようにオプションやキーにより必要な機能が切り替えられるようにしたため、汎用でありながらpsqlに向いた表示ができます。

PSQL_PAGER='ov -C -d "|" -H1 --column-mode --column-rainbow' psql

ヘッダー行の行数を指定(’-H1’)して、ヘッダー行を固定表示しています。ヘッダー行に対してスタイルを指定できるため、区切り文字(’-’)をヘッダーとして扱わなくても済むために1行のみにしています。 またColumn Modeを区切り文字(’-d “|”’)とともに指定することで、列の選択ハイライト表示が可能です。さらに--column-rainbowを追加すると列をそれぞれ別の色で表示できます。

psql-ov psql-ov

--column-modeがあるためヘッダー行と折り返す表示の両方を同時に使用することができます。

ovで区切り文字で列を認識した場合は、縦に揃っていなくてもよいため、以下のように\aでalignを切り替えても問題ありません。

psql-ov2 psql-ov2

詳細はovのpsqlのページを参照して下さい。

PSQL_WATCH_PAGER

PostgreSQL 15.0からはPSQL_PAGERとは別にPSQL_WATCH_PAGERが追加されました。

psqlには\watchコマンドがあり、この前に実行したSQLを定期的に実行して結果を表示することができます。このときの表示にはPSQL_PAGERは使われません。通常PAGERは終了しないと次のSQLの結果を受け取れないため、\watchの自動で実行は相性が悪いためです。

ただPAGER側で終了しなくても\watchの結果を受け付け続けることができれば、\watchの結果をPAGERで表示できます。そのためにPSQL_WATCH_PAGERが追加されました。

PSQL_WATCH_PAGERにはpspgovが指定できます。

pspgのWATCH対応

pspgをPSQL_WATCH_PAGERに指定するときに--streamオプションを付けます。

PSQL_WATCH_PAGER='pspg --stream' psql
SELECT * FROM pg_stat_activity;
\watch 1

\watchにより pg_stat_activityの結果が1秒ごとに更新されます。

psql-pspg-stream psql-pspg-stream

ovのWATCH対応

ovをPSQL_WATCH_PAGERに指定するときに--follow-sectionオプションと--section-delimiter "^$"を付けます。

--follow-sectionはovのオプションで、--section-delimiterで指定した区切り文字で区切られたセクションでフォローモードを有効にします。 --section-delimiterはovのオプションで、^$は空行を区切り文字として指定しています。

つまり空行がある位置までをスクロールして表示し、その後は空行がある位置までスクロールして表示を繰り返します。

PSQL_WATCH_PAGER='ov -w=f --follow-section --section-delimiter "^$" -d "|" --column-mode --column-rainbow' psql

さらに section-start(alt+s) でセクションの開始位置を指定することができます。セクションの開始位置を指定すると、その位置からスクロールして表示を繰り返します。

psql-ov-watch psql-ov-watch