[[Neovim]]でDBを扱える[[データベースクライアント]] [[Neovim DBee]]を試してみたが、思いのほか苦戦したので、その奮闘を記録した。
## 前提
- [[Neovim]]のバージョンはv0.10.2
- パッケージマネージャーは [[lazy.nvim]]
- DBには[[MySQL]] v8.4.3-1.el9 を使用
- [[Docker Compose]]で構築
## インストールと設定
[[lazy.nvim]]の設定を記載。DBの設定を一旦ベタで書いておく。(ローカルなので秘密情報でもない)
```lua
{
"kndndrj/nvim-dbee",
dependencies = {
"MunifTanjim/nui.nvim",
},
build = function()
require("dbee").install("go")
end,
config = function()
require("dbee").setup({
sources = {
require("dbee.sources").MemorySource:new({
{
id = "mydb",
name = "mydb",
type = "mysql",
url = "user:password@tcp(localhost:13306)/mydb",
},
}),
},
})
end,
}
```
## 起動
```lua
:lua require("dbee").open()
```
起動は常に新しい[[タブ (Vim)|タブ]]にしておいた方が使いやすそうだし、[[no-neck-pain.nvim]]もエラーになるので無効化しておけるようなコマンドをキーマップしておくとよい。
```lua
keys = {
{
"<C-j>d",
function()
local dbee = require("dbee")
if dbee.is_open() then
dbee.close()
else
-- 2回目だけエラーになるのでなんとか回避できないか...?
require("no-neck-pain").disable()
vim.defer_fn(function()
dbee.open()
end, 200)
end
end,
},
},
```
### DbeeCreateConnection function が有効でないエラー
```error
[core]: failed registering source: memory FuncUndefined Autocommands for "DbeeCreateConnection"..function remote#define#FunctionBootstrap, line 9: Vim(echoerr):Host " nvim_dbee" for "DbeeCreateConnection" function is not available
```
インストールに失敗している可能性が高いので、手動でインストールコマンドを実行する。
```lua
:lua require("dbee").install("go")
```
### unable to connect to mysql database エラー
```error
[core]: failed registering source: memory function DbeeCreateConnection[1]..remote#define#request, line 2: Vim(let):Error invoking '0:function:DbeeCreateConnection' on channel 3:
adapters.NewConnection: core.NewConnection: adapter.Connect: unable to connect to mysql database: default addr for network 'localhost:13306' unknown
```
設定の書き方が悪かった。
- `mysql://` は不要
- `@tcp(...)` でwrapが必要
```diff
- url = "mysql://user:password@localhost:13306/mydb",
+ url = "user:password@tcp(localhost:13306)/mydb"
```
> [Cannot connect to MySQL · Issue \#14 · kndndrj/nvim\-dbee](https://github.com/kndndrj/nvim-dbee/issues/14)
### no-neck-pain のエラー
```error
Error executing vim.schedule lua callback: .../nvim/lazy/no-neck-pain.nvim/lua/no-neck-pain/colors.lua:133: Invalid window id: 1002
stack traceback:
[C]: in function 'nvim_win_get_buf'
.../nvim/lazy/no-neck-pain.nvim/lua/no-neck-pain/colors.lua:133: in function 'init'
...hare/nvim/lazy/no-neck-pain.nvim/lua/no-neck-pain/ui.lua:163: in function 'create_side_buffers'
...re/nvim/lazy/no-neck-pain.nvim/lua/no-neck-pain/main.lua:108: in function 'callback'
...vim/lazy/no-neck-pain.nvim/lua/no-neck-pain/util/api.lua:115: in function <...vim/lazy/no-neck-pain.nvim/lua/no-neck-pain/util/api.lua:113>
```
[[no-neck-pain.nvim]]を無効 (プラグインではなく機能を) にしておくと発生しない。
## テーブルの中身を確認
サイドバーを `o` で展開しつつ `Enter` -> `List` を選択。ちょっと面倒なのでここは[[Lazysql]]に軍配が上がる。
## SQLの実行
`+new` から note を作成し、[[SQL]]を書く。 **`BB` で実行**できる。
実行結果の分かりにくいショートカットは以下。
| キー | アクション |
| ---- | ------------------- |
| L | 次のページ |
| H | 前のページ |
| F | 最初(First)のページ |
| E | 最後(End)のページ |
`yaj` や `yac` でカーソル位置の結果を[[JSON]]や[[CSV]]で[[ヤンク]]できる。[[ビジュアルモード]]だと選択中のすべて。`yaJ` や `yaC` だと全体。
## 補完
[[cmp-dbee]]を使って実現できる。多分 [[nvim-treesitter]] で `sql` も必要。[[nvim-cmp]]の設定でdependenciesに以下が必要。
```lua
{
"MattiasMTS/cmp-dbee",
dependencies = {
{ "kndndrj/nvim-dbee" },
},
ft = "sql",
opts = {},
},
```
普通に[[SQL]]を書くとDBが特定できないせいか補完されないので、ちゃんと書く必要あり。
```sql
-- mydb.pets p のあとで pの情報が入るので補完がきく (もっといい方法ないか?)
select * from mydb.pets p where p.price < 10000 order by price desc
```
一度補完が表示されるようになると、以降は `mydb` を省略しても補完が表示された。
```sql
select * from pets p where p.price < 10000 order by price desc
```
まあ `pets` だけだと補完候補に大量のゴミが表示されるので、DB名から指定した方が楽かもしれないが...。