NGW開発BLOG
← 記事一覧へ
·#062

NGWSqlAdminないものは造る、私だけのSQL管理ツール

次期バージョンのLinuxで使うSQLツールが要る。多機能な有料版は、使わない機能ばかりだ。ならば造る。必要なものだけを伝え、AIとの対話で1本のPHPに仕上げた自作ツールの記録。

きっかけ — 次期バージョンに、SQLツールがなかった

NGW の次期バージョンは、これまでとは違う Linux サーバの上で動かしている。開発を進めるうちに、地味だが確実に困ることが出てきた。データベースを直接のぞくためのツールがない。

普段の環境では phpMyAdmin を使っている。長く使っていて手に馴染んでいる。Mac 側では SequelAce も試したが、私には少し使いにくい。TablePlus はよくできていて素直に良いと思うが、有料だ。

次期サーバに phpMyAdmin を入れればいい、という話ではある。実際それが一番早い。ただ、入れられない事情も、入れたくない場面もある。手元で完結する軽い道具がひとつ欲しかった。

有料版は、正直いらない

高機能なツールは何でもできる。だが冷静に自分の作業を振り返ると、毎日使うのはほんの一部の機能だ。DBを切り替えて、テーブルの一覧を見て、中身を確認して、たまに SQL を流す。だいたいそれで足りている。

使わない機能に囲まれて目的の操作までクリックを重ねるより、要るものだけが並んでいる方が速い。ないなら造ればいい。昔からの私の流儀である。頭の中には設計図がだいたい浮かんでいた。

必要なものだけを、決める

最初に決めた基本機能は4つ。

  • DB切替 — 対象のデータベースを選ぶ
  • テーブル一覧 — 何があるか一目で
  • 内容確認 — 中身をページ送りで見る
  • SQL実行 — 任意のクエリを流して結果を見る

まずはこれだけ。あとは使いながら、欲しくなったものを足す。最初から全部を設計しきらない。 それも今回のやり方だった。

AIと、1本のPHPで

作り方は AI との対話にした。頭の中の設計図を、必要なものだけ言葉にして渡す。返ってきたものを実際に触って、「ここはこう」「これはいらない」とやり取りしながら肉付けする。

方針は最初にひとつだけ固めた。単一ファイルの PHP、外部依存ゼロ、ダーク基調。 サーバに置くだけで動く状態を最優先にした。

対話が進むほど、道具が自分の手に馴染んでいく。汎用ツールなら「設定でオフにする」ような細かな挙動を、そもそも自分の使い方に合わせて造れる。これは自作ならではの気持ちよさだった。

NGWSqlAdmin のデータ表示画面。ダーク基調で、上部にデータ・構造・SQL・JOINのタブ、その下にSELECT <em>とCOUNT(</em>)のクイックボタン、右上に赤いDROP TABLE / TRUNCATE TABLEの危険操作ボタン。左に「列の表示」切替、下にテーブルの内容がグリッドで並ぶ

NGWSqlAdmin の画面。デモ用のダミーDBでテーブルを開いたところ。データ/構造/SQL/JOIN のタブ、クイックボタン、右上の赤い危険操作ボタン(DROP / TRUNCATE)、左の列表示切替。ダーク基調に、自分が使う操作だけが並ぶ。

使ううちに、育った機能

4つだけで始めたはずが、対話を重ねるうちに、自分が本当に使う機能だけが少しずつ増えた。

  • TABLE と VIEW を分けて表示。 システム系の内部テーブルは一覧から隠す
  • 列のドラッグ&ドロップで並べ替え。表の外へ放り出すと非表示。チェックリストで一括の表示/非表示も
  • SQL の実行結果でも同じ列操作が効く。 見えている結果を CSV で書き出す
  • SQL エディタの横に列名パネル。ダブルクリックで挿入、必要なら前カンマを自動で付ける
  • EXPLAIN の結果を日本語で簡易分析。 「ここはフルスキャン」「ここは主キー参照で速い」と指摘する
  • 本命の JOINビルダー。テーブルを選び、キーを選ぶ(同名の列は自動で候補提案)だけで JOIN 文が組み上がる。「キー確認」で実際に噛み合うかを数件だけ試せる
  • 危険な操作にはガード。 SELECT 以外を流すときや、DROP / TRUNCATE には確認ダイアログを出す

どれも私が実際に使うから足した。使わない機能は最初から存在しない。引き算で始めて、要るものだけ足す。 既製の万能ツールとは、ここが決定的に違う。

設計判断のメモ

意識して選んだことを残しておく。

単一ファイル・依存ゼロ。 ビルドもインストールも要らない。ファイルを1本置けば動く。可搬性が高く、壊れにくい。外部へ通信しないので、ネットにつながらない環境でもそのまま完結する。閉域網で仕事をすることが多い私には、これが効く。

あえて AJAX を使わない。 操作のたびにページを読み込み直す素朴な作りにした。その代わり、JOIN の組み立て途中の状態などはブラウザの localStorage に持たせ、実行をまたいでも消えないようにした。シンプルさと引き換えの割り切りだが、結果として見通しがよく壊れにくい。

任意 SQL の実行は、強力な刃物だ。 何でも流せるということは、何でも壊せるということでもある。アクセスは絞り、危険な操作には確認を挟み、そもそも外に公開しない前提で運用する。便利さと危うさは背中合わせだ。作りながら何度も思った。

余談 — 手書き時代の道具が、AI時代に居場所を持つ

作り終えて思ったことがある。この JOINビルダーは、SQLを手で書いていた時代にあれば、開発効率がずいぶん上がっていただろう、と。

3表・4表と重ねる JOIN は、エイリアスと ON 句を何度も見直し、キーが噛み合わずに空振りする。あれを何年やったか分からない。クリックで組めて、実際に繋がるかを数件で試せたら、どれだけ楽だったか。二十年遅れで自分に配ってやりたい道具である。

面白いのは、SQL をほぼ AI が書くようになった今でも、この道具は要らなくならないことだ。役割が「書く」から「確かめる・掴む」へずれるだけである。

  • AI が出した JOIN が本当に噛み合っているかを目視で確かめられる(AI も時々ポンコツをやる)
  • 初見のスキーマで、どの列で繋がるのかを手で探る探索ツールになる
  • 命名規則を手がかりにしたキーの自動提案は、決定的・即時・オフラインで効く。確率で文章を紡ぐ AI とは別種の強みで、ネットにつながらない環境でもそのまま動く

SQL を書く時代の効率化ツールとして生まれたのに、実際は SQL を検証し、理解する時代のツールとしても筋がいい。手書き時代の発想が、AI 時代に居場所を持っている。作ってみて初めて腑に落ちた。

AIとの協働作業での学び

設計図は最初から頭の中にあった。AI に渡したのは、その全部ではなく必要なものだけだ。曖昧に「いい感じの管理ツール」と頼むのではない。「まず DB 切替とテーブル一覧と SQL 実行、単一ファイルで」と具体的に区切って渡す。返ってくるものの精度が上がる。足りない所は、触ってから言葉にして足せばいい。

こうして 1本の PHP で完結する私だけの SQL ツールができた。市販の万能ツールのように何でもはできない。だが自分の作業には過不足なく手が届く。名前は NGWSqlAdmin。NGW 専用の、ささやかな MySQL 管理ツールだ。

ないものは、造ればいい。昔からの流儀は、相棒が AI に変わっても変わらなかった。変わったのは造るのにかかる時間だけである。一日だ。二十年前の私に言っても、たぶん信じない。