MySQLShellのページャーにovを！

この記事は、[2024年Advent Calendar](https://qiita.com/advent-calendar/2024/mysql)の12月8日の記事です。
実は、[PostgreSQL Advent Calendar 2024 12月6日の](https://qiita.com/noborus/items/6ac19b754f896e41197c)のMySQLShell版です。

## MySQLShellのページャー

MySQLShellではページャーの設定ができます。ページャーを設定していない場合は出力が流れてしまい、端末等のスクロールをさかのぼって確認する必要があります。

## lessページャー

そこでページャーを使用しますが、そのとき、一番使われているページャーは`less`ではないでしょうか。

`less`は昔からあり、安定していて、完成して機能追加もされていない...と思っていませんか？
実は、`less`は今も開発が進んでいて、新しい機能が追加されています。`less`のバージョンを確認して、603以上であれば、大きな機能追加がされています。

```console
less --version
less 671x (GNU regular expressions)
```

※ ここでは開発版の671xを使用しています。603以上であれば使えるはずですが、多少動作は違うかもしれません。

![通常のless](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18555/1c3b6f42-66f1-ed4f-41fb-d469e9622a93.png)

画面に収まらないので、カラム名と枠線により最初の方のデータしか表示されていません。ここで表示をとどめておいて、スクロールして表示できるようにしているのがページャーです。
そして、通常はスクロールしていくと、カラム名や枠線もスクロールで消えていきデータだけが表示されます。
ページャーとは表示する中身に関係なく、１画面分を表示するためのもの...だったのは昔の話です。

その画面のまま`--header`と打ってみましょう。これは`less`のオプションを起動後に指定して切り替えています。

`Header lines:`とプロンプトが出るので、2と入力してEnterを押してください。

折返し表示がなくなり横スクロールするマークが表示されるようになっています。
これで上の2行（枠の上部とカラム名）はヘッダーとして常に表示されるようになります。

![ヘッダー付きless](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18555/df4868c2-5a41-3d71-d1d4-df1f5d4898df.png)

今までたくさんのカラムを表示していたときには\Gを使用するといった方法がありましたが、ページャーの機能により見やすくなることがわかりました。

もっと便利にしたいですか？それならば[ov](https://github.com/noborus/ov)をおすすめします。

## その前にpspg

MySQLShellの結果表示を改善するために、`pspg`を使うこともできます。
[pspg](https://github.com/okbob/pspg)

`pspg`はカラム名の固定やカラムを固定して表示することができます。もともとPostgreSQL用として作られたようですが、MySQLShellのデータを表示するために便利に使えます。

## ovページャー

[ov](https://github.com/noborus/ov)は、私がGo言語で作成しているページャーです。

`pspg`と同じように`psql`のページャーとして使えるように開発を開始しましたが、当初から汎用のページャーとしても使えるように設計しています。

そのため、MySQLShellに対応した機能を備えつつも、デフォルトでは単純なページャーとして機能し、オプションによってより最適な表示を実現しています。

### インストール

Go言語がサポートしている環境であれば動作します。

まず、`ov`をインストールします。以下のコマンドを実行してください。[リリースページ](https://github.com/noborus/ov/releases)から各種パッケージやバイナリがダウンロードできます。Go言語で作られているのでバイナリもダウンロードしてパスのあるところに置くだけで使えます。

また、Go言語がインストールされている環境であれば、以下のコマンドでインストールできます。

```sh
go install github.com/noborus/ov@latest
```

`pspg`と同じように`psql`のページャーとして使えるように開発を開始しましたが、当初から汎用のページャーとしても使えるように設計しています。

そのため、表形式に対応した機能を備えつつも、オプションによる切り替えによって実現しています。

### 設定

`ov`は汎用のページャーとして使えるようになっていので、環境変数`PAGER`に設定することで様々な場面で使えます。

MySQLShell用にオプションを設定する場合は、MySQLShell上でオプションを永続化するように設定します。

オプションは好みによりますが、この後解説していきます。

推奨例は以下のようになります。

```js
shell.options.setPersist("pager","ov -F -H1 --skip-lines 1 -C -d'|' --column-mode --column-rainbow --align")
```

SQLモードとPythonモードでは、以下のように設定します。

```console
\option --persist pager "ov -F -H1 --skip-lines 1 -C -d '|' --column-mode --column-rainbow --align"
```

この実行により、~/.mysqlsh/optios.jsonに追加されていると思います。

### オプション

`-F`または`--quit-if-one-screen`は、`less`と同じで1画面に収まる場合はページャー画面を表示せずに（実際には受け取った分を出力だけして）すぐに終了します。

### ヘッダー機能（とスキップ機能）

まずはヘッダー機能です。`less`の`--header`と同じようにヘッダーを固定表示できます。オプションは`--header 数値`または`-H 数値`です。
`ov`では、ヘッダーを指定しても折り返して表示できます。
MySQLShellではカラム名の上下に区切り線で囲まれていますが、`ov`ではヘッダーのスタイルを変更できるので、背景色を変えると`-H1`でも十分にわかりやすくなります。
ヘッダーのスタイルで見やすくしているので、上下の区切り線は無くても良いので、上の区切り線を表示しないようにする、`--skip-lines 1`を指定しています。

![ovヘッダー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18555/9e289d78-2904-ec7c-6cac-4880a007c195.png)

### 交互に色を変える

たくさんの行と列がある場合は、パット見でどの行かがわかりにくくなるため、交互に背景色を変えて表示している表はよくあります。それを実現するオプションが`--alternate-rows`または`-C`です。

![ov交互に色を変える](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18555/f255b993-4418-0b21-968c-66ee61b5fbe3.png)

### カラムモード

「行」がわかったとしても、カラムが多い場合は折返し表示になり、カラム名が表示されていたとしても、どのカラムかわかりにくくなるため、カラムを選択するモードがあります。これはカラムの区切り文字を指定して、カラムを特定し、そのカラムだけをハイライト表示するモードです。
まず、カラムの区切り文字を指定するオプションが`--column-delimiter "|"`または`-d "|"`です。
そして、カラムモードを指定するオプションが`--column-mode`または`-c`です。

これによりカーソルを動かすことで、どの行のどのカラムかがわかりやすくなります。

![ovカラムモード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18555/9d1d14ed-b682-9445-751b-75c5f2378773.png)

### カラムレインボー

カラムモードはカーソルを動かしてハイライト表示する必要がありますが、カラムレインボーはあらかじめカラム毎に色を割り当てて表示します。これにより、さらにカラムを特定しやすくなります。
オプションは`--column-rainbow`です。

![ovカラムレインボー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18555/af2ce3c8-fb76-3673-1ffc-627d1180ce67.png)

### カラムの縮小表示

MySQLShellの結果は、カラムの幅を揃えているため、ページャー側で揃える必要はありませんが、幅を揃えるモードにしておくと、カラムを選択して縮小表示ができるようになります。
選択したカラム上で`s`キーを押すと縮小表示と通常表示を切り替えることができます。
これにより長いカラムが長いカラムが邪魔になったときにもクエリを再実行することなく、一覧表示できます。

![ovカラムの縮小表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18555/b9456293-24e6-f1a6-ce94-b9cefd5bd029.png)

### まとめ

`ov`はもともと`psql`の結果表示を改善するために開発を開始しました。
そのため、テーブルの表示に最適な機能を備えてMySQLShellでも便利に使えると思います。
また、汎用ページャーとしての機能も豊富に備えているため、様々な場面で使えるページャーとして使えるようになっています。