[[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名から指定した方が楽かもしれないが...。