[[📒Articles]] > [[📒2024 Articles]]
![[2024-12-08.webp|cover-picture]]
[[Lazygit]]や[[Lazydocker]]は好きですか? 私は好きです。そんな方にオススメ、ターミナルでDBの中身を参照したり、データを更新できる[[TUI]]ツール『[[Lazysql]]』を紹介します。
## はじめに
私はデータベースエンジニアではありません。APIを開発するときにDBを参照・更新するくらいで、プロダクション環境での構築や運用の経験はほぼゼロです。APIのミディアムテストを書くときに、ローカル環境で[[Docker Compose]]を使って構築するくらいでしょうか。
そんな私が普段使っている[[データベースクライアント|SQLクライアント]]は[[DBeaver]]です。[[DBeaver]]は 2024/12/07 時点で40000以上のスターを獲得している人気OSSです。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
GitHub - dbeaver/dbeaver: Free universal database tool and SQL client
</div>
<div class="link-card-v2-content">
Free universal database tool and SQL client. Contribute to dbeaver/dbeaver development by creating an account on ...
</div>
<img class="link-card-v2-image" src="https://repository-images.githubusercontent.com/44662669/f3f5c080-808b-11ea-9713-2bea65875d95" />
<a href="https://github.com/dbeaver/dbeaver"></a>
</div>
[[DBeaver]]を利用し始めたのは5年くらい前ですが、当時から現在に至るまで、そのクオリティは頭1つ抜きんでてる印象です。直感的で考えられたUI、非常に多機能であり、1つ1つの機能も高いクオリティです。[[データベース]]周りのツールはストイックな印象が強かったのですが、良い意味で期待を裏切られました。
## ターミナルに引き篭もってLazyになる日々
他方、この5年間で私の開発環境や思想も大きく変わりました。最も大きなターニングポイントの1つは、[[Vim]]の思想を導入したことです。
> [!note]
> [[Vim]]との歴史を紐解くと非常に長くなってしまいますので、ここでは割愛します。12月23日の[[Vim駅伝]]参加記事『2024年 Neovim成長日記』の冒頭でも改めて触れますので、気になる方はそちらをお待ちいただければと思います。
そして、この1年間... [[Neovim]]以外のエディタは全く使わなくなりました。コーディングでも、メモでも、タスク管理でも。唯一の例外は、[[Minerva]]([[PKM]])のために[[Obsidian]]を使うくらいでしょうか。
[[Neovim]]しか使っていないということは... もちろんです。作業をするときは、ほぼターミナルしか起動していません。[[Google Chrome]]や[[Bruno]]、[[Mockoon]]など一部はどうしても必要になりますが、それ以外は極力ターミナルの中に引き篭もっています。では、すべてをシェルのコマンドで実行しているかというと、そうではありません。[[TUI]]のツールを使っています。
代表的な[[TUI]]ツールは[[Lazygit]]でしょう。[[Git]]に関するほぼすべての操作を、キーボードだけで効率的に行える素晴らしい[[gitクライアント]]です。スターはなんと5万超え!
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
GitHub - jesseduffield/lazygit: simple terminal UI for git commands
</div>
<div class="link-card-v2-content">
simple terminal UI for git commands. Contribute to jesseduffield/lazygit development by creating an account on G ...
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/4ebefd4e2ab2df49291e1ff2bc2e02b4f34864b82362e68d9a371f00dbf0f4d8/jesseduffield/lazygit" />
<a href="https://github.com/jesseduffield/lazygit"></a>
</div>
1年前にArticleも書きました。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" />
<span class="link-card-v2-site-name">Minerva</span>
</div>
<div class="link-card-v2-title">
📘Lazygitを自分好みにカスタマイズしてみた
</div>
<div class="link-card-v2-content">LazygitはGo製のTUI型gitクライアントで、UbuntuやWSL環境でのカスタマイズ方法や、Nerd Fonts・deltaによる見やすいdiff表示、Neovim連携設定を詳しく解説しています。Windowsでのレイアウト崩れやコミットグラフの改善点も紹介。カスタマイズ性や他のgitクライアントとの違いが気になる方はぜひご覧ください。</div>
<img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/%F0%9F%93%98Articles/attachments/2023-12-10.jpg" />
<a data-href="📘Lazygitを自分好みにカスタマイズしてみた" class="internal-link"></a>
</div>
%%[[📘Lazygitを自分好みにカスタマイズしてみた]]%%
> [!attention]
> 1年前の記事なので、現在の設定は結構変わっています。特に[[Neovim]]との連携は[[lazygit.nvim]]を使うようになりました。
他にも、[[Docker]]を使うときは[[Lazydocker]]を使っています。今までいちいちコマンドで確認してた自分を葬り去りたくなるくらい素晴らしいツールです。こちらのスターも4万近くあります。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
GitHub - jesseduffield/lazydocker: The lazier way to manage everything docker
</div>
<div class="link-card-v2-content">
The lazier way to manage everything docker. Contribute to jesseduffield/lazydocker development by creating an ac ...
</div>
<img class="link-card-v2-image" src="https://repository-images.githubusercontent.com/187335810/d5cecc00-9b1c-11e9-8abf-5649b23bce13" />
<a href="https://github.com/jesseduffield/lazydocker"></a>
</div>
## Lazysqlとの出会い
[[DBeaver]]の機能は昔も今も非常に素晴らしく、感謝ばかりで不満は皆無... と思っていたのですが... 1つだけあります。
```
『Neovimで開発中に、サクっと10秒くらいテーブルの情報を見たいときに、DBeaverを立ち上げるの... 少し億劫なんだよなぁ...』
```
こんなことを言いだすと、早々に声が聞こえてきます。
```
『1度起動してそのままにしておけば問題ないだろ?』
```
おっしゃる通りです。それが普通の反応だと思います。しかし、Lazyな読者の方なら私の気持ちも分かってくれるはずだ...。
```
『公式が提供しているSQLクライアントを使えば? mysqlとかpsqlとかさ』
```
公式提供の[[データベースクライアント|SQLクライアント]](CLI)はこれまた少し違うんです。これでいいなら、[[Git]]も[[Docker]]もCLIを使って満足できるはずです。この溝に落ちたなんとも言えない気持ちを救ってくれるのがLazyシリーズ、[[Lazygit]]であり[[Lazydocker]]だったわけで...。
実は以前に`lazymysql`という名前で調べたことがあるのですが、そのときはヒットしませんでした。ただ、今思い返してみると `mysql` というのは絞りすぎたのかもしれません。`lazysql`という名前で改めて検索してみたところ、ヒットしました! [[Lazysql]]!
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
GitHub - jorgerojas26/lazysql: A cross-platform TUI database management tool written in Go.
</div>
<div class="link-card-v2-content">
A cross-platform TUI database management tool written in Go. - jorgerojas26/lazysql
</div>
<img class="link-card-v2-image" src="https://opengraph.githubassets.com/f93ac515f94820f26febb1bb8a6fd31477de6ef186d5abacfe44884f879cab45/jorgerojas26/lazysql" />
<a href="https://github.com/jorgerojas26/lazysql"></a>
</div>
スターは 2024/12/07 時点で1000に届いていませんが、まだ開発がはじまってから1年ほどの若いリポジトリです。メンテもしっかりされてそうですし期待が持てます。
> [!warning]
> READMEには『[[Lazysql]]はalpha版フェーズであり、バグも多い』 と書かれています。**プロダクション環境など失敗が許されないケースでの利用は控えましょう**。
> > This project is in ALPHA stage, please feel free to complain about my spaghetti code.
> >
> > I use Lazysql daily in my full-time job as a full-stack javascript developer in its current (buggy xD) state. So, the plan is to improve and fix my little boy as a side-project in my free time.
## Lazysql作者のアツイ想い
なによりREADMEコメントがアツイです。
> This project is heavily inspired by Lazygit, which I think is the best TUI client for Git.
> I wanted to have a tool like that, but for SQL. I didn't find one that fits my needs, so I created one myself.
[[Lazygit]]のようなものがなかったから自分で作り始めた...と。
> I live in the terminal, so if you are like me, this tool can become handy for you too.
わかります😊
> This is my first Open Source project, also, this is my first Go project. I am not a brilliant programmer. I am just a typical JavaScript developer that wanted to learn a new language, I also wanted a TUI SQL Client, so white and bottled.
[[Lazysql]]は初の[[OSS]]であり、初の[[Go]]開発プロダクトであるとのこと。そして、[[JavaScript]]以外の新しい言語を学びたいと思っており、ちょうど[[TUI]]の[[データベースクライアント|SQLクライアント]]が欲しかったとのこと。
> I use Lazysql daily in my full-time job as a full-stack javascript developer in its current (buggy xD) state. So, the plan is to improve and fix my little boy as a side-project in my free time.
普段の仕事で毎日[[Lazysql]]を利用されているようです。個人的には、**自分で毎日使うモノを作ること**以上のモチベーションはないと思っていますので、[[Lazygit]]は将来性にも期待できそうと感じます。
## 実際に動かしてみる
ここからは実際に動かしてみます。
### インストール
まずはインストールから。[[Go]]がインストールされていれば以下のコマンドでインストールできます。
```console
go install github.com/jorgerojas26/lazysql@latest
```
私は[[mise]]を使っているので、[[mise]]のcore機能を使ってインストールしました。
```console
mise use -g go:github.com/jorgerojas26/lazysql@latest
```
### MySQL DBの用意
接続対象のDBを用意します。私は[[Docker ComposeでMySQLコンテナを作成]]していますが、手段や中身は各々の都合にあったもので問題ありません。
### lazysqlの起動
`lazysql` コマンドを実行すると、シンプルな起動画面が一瞬で立ち上がります。
![[Pasted image 20241208145944.png]]
> [!hint]
> `lazysql` と毎回打つのは面倒なのでエイリアスを設定しておくと便利です。
>
> ```console
> aliase lq='lazysql'
> ```
### 接続設定の追加
参照したいDBの接続設定を追加しましょう。`n` キーで作成画面に移りますので、接続名と接続情報を記載します。
![[Pasted image 20241208150241.png]]
> [!attention]
> ここの記載内容はDBによって変わります。画像の内容を模写しても、全く同じ方法でDBコンテナを作成していない限りは接続できません。
`F1` キーで接続情報が保存されます。
> [!info]
> 接続情報は `~/.config/lazysql/config.toml` に保存されます。もちろん、[[TUI]]からでなく[[TOML]]を直接編集することでも管理できます。
> ```toml
> [[database]]
> Name = 'mydb'
> Provider = 'mysql'
> DBName = 'mydb'
> URL = 'mysql://user:password@localhost:13306/mydb'
> ```
### 接続する
接続情報を保存したら、以下のように起動画面の一覧に表示されます。
![[Pasted image 20241208150432.png]]
接続には `c` キーか `Enter` キーを使います。候補が複数存在する場合は、`j` `k` などのキーで接続したい接続情報を選択する必要があります。接続に成功すると以下のような画面になります。
![[Pasted image 20241208150801.png]]
### テーブルの中身を確認する
`mydb` で `Enter` を押すと、テーブル一覧が展開されます。その中で中身を確認したいテーブルを選択して `Enter` を押します。
![[Pasted image 20241208151030.png]]
上手くいけばテーブル内のデータが表示されます。デフォルトで右サイドバーが表示されていますが、一番右のカラムが見えなくなってしまうので、必要なければ `Shift+s` キーで非表示にしておきましょう。
![[Pasted image 20241208151238.png]]
### 終了
`q` キーで[[Lazysql]]を終了できます。
## Lazysql 実用レシピ
私が[[Lazysql]]でよく行う操作を紹介します。
### キーマップの確認
`?` キーですべてのキーマップを確認できます。他のキーを忘れてしまっても、これだけ覚えていれば対処できますので、最優先で覚えておきましょう。
![[Pasted image 20241208152351.png]]
特に以下の移動系は頭に入れておいた方がスムーズに操作できます。
| キー | 内容 |
| ------ | ----------------------------------------- |
| g | 一番上へ移動 |
| G | 一番下へ移動 |
| j | 下へ移動 |
| k | 上へ移動 |
| h | 左へ移動 |
| l | 右へ移動 |
| / | 入力欄に移動 |
| ] | 次のタブへ移動 |
| [ | 前のタブへ移動 |
| > | 次のページへ移動 |
| < | 前のページへ移動 |
| S | 右サイドバーの表示切替 |
| s | 右サイドバー/テーブルのフォーカス切り替え |
| L | テーブルにフォーカス |
| H | ツリーにフォーカス |
| Ctrl+e | SQLエディタを開く |
### 対象テーブルのデータを確認する
300件以下のデータを全部見たいのであれば、[[#実際に動かしてみる]] で紹介した内容そのままです。300件以上の場合はページングされますので `>` キーや `<` キーを使います。
![[Pasted image 20241208152409.png|frame]]
*300件以上の結果(311件)の2ページ目を表示*
結果をフィルタリングする場合は `/` キーを押します。WHERE句以降の条件を入力できます。
![[Pasted image 20241208153141.png]]
いくつか挙動に注意点があります。
- 2ページ目以降を表示している状態で、絞り込んだ結果が300件以下だと、結果が0件に見えてしまう (実際は1ページ目に表示されている)
- 2ページ目以降が存在する場合、`<` や `>` の入力がページ変更に持っていかれる
- `BS` が1文字削除ではなく、起動画面へ戻るホットキーとして認識されてしまうことがある
- 面倒でも文字を削除するときは `Del` を使った方がいいかも
- 補完が表示されるのは1つ目の条件句のみ。先の例だと `and stay = 1` の部分は補完が効かない
しっかりデータを確認したいときは、このあと紹介するSQLエディタを使った方がよさそうです。
### SQLエディタで結果を確認する
`Ctrl+e` キーでSQLエディタが新しいタブとして開かれます。タブは `[` と `]` で切り替えられます。
![[Pasted image 20241208154027.png]]
`/` で[[SQL]]入力欄を編集するモードになるので、[[SQL]]を記載し、`Ctrl+r` キーでクエリを実行します。
![[Pasted image 20241208154501.png]]
> [!warning]
> このモードでは `limit` を指定しないと全件取得する挙動になっている可能性があります(未確認)。パフォーマンスに影響を及ぼすリスクがありますので、対象によっては必ず `limit` を指定しましょう。
### データを更新する
私のユースケースではデータを更新する機会は少ないです... が、[[Lazysql]]は[[TUI]]での更新もサポートしています。更新したいセルで `c` キーを押すと変更モードになります。
![[Pasted image 20241208160147.png|frame]]
*『ヒョウスケ』を『ちーちゃん』に変更中*
変更したセルはオレンジ色になります。この時点ではまだDBは更新されていません。ペンディング状態です。
![[Pasted image 20241208160344.png]]
`Ctrl+s` を押すと確認ダイアログが表示され、YESを選択するとDBのデータが更新されます。
![[Pasted image 20241208160452.png]]
## Lazysqlの気になる点
『ターミナルで素早くDBを確認したい』という用途に適した[[Lazysql]]ですが、気になる点もあります。
### 不安定な挙動が多い
READMEでもalpha版である旨が記載されている通り、少しの時間いじっていると、ある瞬間から操作を受け付けなくなることがしばしばあります。サッとテーブルの中身を確認したいだけなら問題ありませんが、現時点では以下の用途には向かないかもしれません。
- 長い時間起動(操作)する
- データを更新する
### クエリのコピーが弱い
入力したクエリをコピーする術がなさそうです。キーはもちろんのこと、[[TUI]]の特性上かターミナルでの選択コピーもできませんでした。[[Lazygit]]だと以下の対応で賄っている印象です。
- ホットキーに対応する
- [[Neovim]]などのエディタで該当テキストを開く
### SQLエディタの補完がない
SQLエディタとしての補完はありません。そのため、慣れているテーブルやコマンドでないと、一発で[[SQL]]を書ききって実行するのは難しい印象を受けました。[[TUI]]での補完は難しそうなので、これは適性の問題なのかもと思っています。
## まとめ
[[TUI]]の[[データベースクライアント|SQLクライアント]]『[[Lazysql]]』を紹介しました。
今までは、標準の[[データベースクライアント|SQLクライアント]]を使うか、[[DBeaver]]を使うかの二択でしたが、その間のニーズを拾える良いツールだと感じています。alphaフェーズということもあり、不安定な挙動も多いですが、アクティブに開発されていそうなこともあり、定期的にウォッチしていくつもりです。余力があれば、バグ修正にも貢献していければと😊