ℹ️ インストール方法
Homebrew でインストールできます。
brew tap hatohato25/sqsh
brew install sqsh
🍀 はじめに
MySQL WorkBench を業務で利用しています。インポート、エクスポートでちょっとクセがありますが、基本的な機能は満足して使わせてもらっています。
ですが、利用においてちょっとしたストレスを感じることがありました。GUI で目的のものを選択するまで、目的のレコードにたどり着くまでのちょっとした"待ち"にストレスを感じていました。そこで、手触りの良さにとことんこだわった TUI MySQL クライアント を自作しました。
この記事では、開発したクライアントの機能と、こだわりのポイントについてご紹介します。
この記事の対象読者
- MySQL を日常的に使っているエンジニア
- ターミナルでの作業を好み、TUI ツールに興味がある方
- キーボード中心の操作で生産性を高めたいと考えている方
前提知識
この記事を読むにあたって、以下の知識があると理解しやすいです:
- MySQL の基礎知識
なぜ TUI MySQL クライアント を自作したのか
既存ツールへの不満
MySQL WorkBench などの GUI クライアントは高機能で使いやすいですが、ターミナル作業の途中で切り替えるのが面倒に感じることがあります。
また、SRE な私は業務で管理する RDS インスタンスが多く、MySQL WorkBench を開くと接続先一覧で画面が埋まっていて、その中から目的の接続先を探すのに時間を使う、とても残念な作業を日々行っています。
100 万レコードを超えるテーブルを開こうとすると、アプリケーションがフリーズしたかのようになり、読み込み中は操作不能になるなどといった課題も感じていました。
こだわったポイント:手触りの良さ
このクライアントを作るにあたって最も重視したのは、操作のリズムと手触りです。具体的には:
- Fuzzy Finder を全面的に採用し、どの選択操作も素早くできるようにする
- 大量データでもストレスなく表示できる仕組みを取り入れる
- SQL 入力をサポートする機能を充実させる
これらを実現することで、ターミナルから一歩も出ずに、快適に MySQL を操作できる環境を目指しました。
参考とした大好きなツール
zoxide と fzf を連携させて利用する cd 拡張ツールに惚れ込んでいて、zi コマンドが無くては生きていけない体になっています。この Fuzzy Finder 機能をデータベース操作でも利用したいと考えました。
🌈 主要機能の紹介
Fuzzy Finder による階層的な選択
このクライアントの中核をなす機能が、Fuzzy Finder を用いた選択操作です。
接続先 → データベース → テーブル → レコード の各階層すべてで Fuzzy Finder が使えるため、キーボードから手を離すことなく、インクリメンタルサーチで目的の場所まで素早くナビゲートできます。
たとえば、複数の接続先を管理している場合でも、接続先名の一部を入力するだけで絞り込めます。データベースやテーブルの選択も同様です。
接続先選択 → (fuzzy search) "loca" と入力 → 即座に絞り込まれる
↓
データベース選択(sd [show database のスニペット]) → (fuzzy search) "anal" と入力して選択
↓
テーブル選択(st [show tables のスニペット]) → (fuzzy search) "eve" と入力して選択
↓
レコード一覧が表示される
Fuzzy Finder は部分一致・あいまい検索に対応しているため、正確なスペルを覚えていなくても素早く目的のものを見つけられます。
100 万レコードでも快適な Stream 取得
大量のレコードを持つテーブルを開いたとき、全件をメモリに読み込もうとすると表示が重くなってしまいます。このクライアントでは、レコードを Stream で逐次取得する方式を採用しているため、100 万レコード規模のテーブルでも、最初の表示がすぐに始まり、快適に操作できます。
従来のクライアントで発生しがちな「表示されるまでしばらく待つ」という体験を、できる限り排除しました。
Stream 取得により、表示開始までの待ち時間を最小化しています。スクロールやフィルタリング操作も、取得済みのデータに対してリアクティブに動作します。
SQL 入力をストレスフリーにする機能群
MySQL を操作する上で避けて通れないのが SQL の入力です。このクライアントでは、SQL 入力を快適にするための機能を複数用意しています。
スニペット機能
よく使う SQL をスニペットとショットカットキーに登録しておきました。
| スニペット | ショートカットーキー | アクション |
|---|---|---|
sd |
Ctrl+D |
show databases |
st |
Ctrl+T |
show tables |
sc |
Ctrl+S |
Column selection mode (table → column picker) |
ショートカットキー
入力を補助するショートカットキーを割り当てています。
| ショートカットーキー | アクション |
|---|---|
Ctrl+A |
Select all |
Ctrl+C |
Copy selection / quit (no selection) |
Ctrl+V |
Paste from clipboard |
Ctrl+X |
Cut selection |
Ctrl+K |
Delete from cursor to end of line |
Ctrl+U |
Delete from start of line to cursor |
Ctrl+W |
Delete previous word |
Ctrl+Y |
Paste from kill buffer |
Ctrl+E |
Move cursor to end of line |
Home / End
|
Move cursor to start / end of line |
Alt+← / Alt+→
|
Move cursor one word left / right |
Shift+← / Shift+→
|
Extend selection left / right |
Alt+Shift+← / Alt+Shift+→
|
Extend selection one word left / right |
入力補完
よく使う予約語、テーブル名やカラム名の補完機能により、SQL を入力する際の負担を軽減しています。スペルミスによるエラーを事前に防ぐことができます。
Readonly 設定
本番環境への誤った書き込みを防ぐため、接続先ごとに readonly モードを設定できます。
readonly に設定した接続先では、SELECT 以外の操作が制限されるため、「本番 DB に誤って UPDATE を実行してしまった」というインシデントを防ぐことができます。
設定方法は 2 通りあります:
- config.toml で接続先ごとに設定する(永続的に反映)
- 起動時のオプション指定で設定する(その接続のみ適用)
# 起動時に readonly モードで起動する例(オプション名は README を確認してください)
sqsh -r
本番環境の接続先には、設定ファイルで readonly: true を設定しておくことを強くおすすめします。
日本語・英語の多言語対応
UI のラベルやメッセージが日本語と英語の両方に対応しています。available for English.
設定方法は 2 通りあります:
- config.toml で設定する(永続的に反映)
- 起動時のオプション指定で設定する(その接続のみ適用)
# 起動時に言語を選択して起動する例(オプション名は README を確認してください)
sqsh --lang ja
接続先を管理する
設定方法は 2 通りあります:
-
指定しない(オプション無しで
~/.config/sqsh/config.toml) - 起動時のオプション指定で設定する(その接続のみ適用)
# デフォルト以外の接続先一覧を指定する例(テスト環境のみの一覧など分けて管理もできる)
sqsh --config /path/to.toml
接続先など詳細な設定方法については、GitHub リポジトリの README を参照してください。toml で一元管理できるようになっています。
テスト用のコンテナ
テスト用に 100 万レコードのテーブルを含む MySQL コンテナを用意しています
リポジトリに compose ファイルがありますので、ぜひ試してみてください
# docker/init 以下の sql が入ります
docker compose up -d
詳細な手順はGitHub リポジトリの README を参照してください。
💾 まとめ
この記事では、手触りの良さにこだわって制作した TUI MySQL クライアント の主要機能をご紹介しました:
- Fuzzy Finder による階層的な選択で、目的のレコードへ最短距離でアクセス
- Stream 取得により、100万レコード規模のテーブルでも快適に操作可能
- スニペット・ショートカット・入力補助で、SQL 入力のストレスを軽減
- readonly 設定で、本番環境への誤操作を防止
- 日本語・英語の多言語対応
ターミナルから離れずに MySQL を操作したい方、既存の GUI クライアントにストレスを感じている方にぜひ試していただけると嬉しいです。
フィードバックや機能リクエストは GitHub の Issue でお待ちしています。
