Database Ops · Local-only

CLIのDB操作を、ボタンで。

うろ覚えのDB CLIコマンドを、Web UIに。AIなし、魔法なし。psql / mysql の操作をクリックに変え、すべて自分のマシンの上で動きます。

git clone https://github.com/MR-TABATA/cli2ui cd cli2ui docker compose up

ローカル完結・Docker

cli2uiのワークスペース概要。各パネルがワンクリックで開き、ライブな件数が出る

機能

押す前に、結果を見る

危ないのは操作そのものより、やってみるまで分からないことです。答えを出せるものは、先に出します。どれも本番のDBに何も残しません。

UPDATEを実行しようとして、読み取り専用のトランザクションで拒否された画面

制約違反は、何行あるか

NOT VALIDな外部キーの違反行を、検証もせず、何も変えずに数えます。

外部キーの違反行の件数と、NOT VALIDの一覧

本物のDBクライアントが、自分のマシンで動く

ワークスペース概要は、各パネルがワンクリックで、ライブな件数つきです。テーブル詳細では、列・インデックス・行プレビュー・フィルタ・CSVのインポート/エクスポート、バックアップやリネームまで。

テーブル詳細。行のプレビューとフィルタ、ワンクリックの操作

SQLランナーは、既定で読み取り専用

既定は読み取り専用のトランザクション、文のタイムアウトと1000行の上限つきです。SQLを解析して弾くのではなく、サーバー自身が書き込みを拒否します。EXPLAIN、スケール、インデックスのwhat-ifも使えます。

SQLランナー。クエリと実行結果、EXPLAINとインデックスを試すボタン

インデックスラボ:作る前に、効くか測る

仮想のインデックスを1つのトランザクションの中で作り、EXPLAIN ANALYZEで前後を比べて、ROLLBACKします。本当に効くか確かめてから作れます。

インデックスの前後でEXPLAIN ANALYZEを比べ、7.1倍速いと出た画面

詰まらせないDDL

ALTER / DROP / TRUNCATE / リネームは、短いlock_timeout(2秒)で実行します。ロックが取れなければ諦めて、誰も待たせません。

列の編集。ロックが取れなかったときに、何も変えずに戻ったことを示す画面

EXPLAINのスナップショットと差分

実行計画を保存して、前と後を差分で見ます。インデックスを足す前後の2つの計画を、並べて比べられます。

インデックス追加の前後の実行計画の差分

スケールシミュレーション

同じクエリを、実際の行数の1倍・100倍・10000倍でEXPLAINします(pg_classを一時的に書き換えて、必ずROLLBACK)。データが増えたとき、計画がどこで崩れるかが見えます。

行数を100倍・10000倍にしたときの実行計画の変化

アクティビティ

実行中のクエリと接続を、pg_stat_activityから表示します。ワンクリックでcancel / killできます。

ロック

待機の連鎖をツリーで表示します。先頭に大元のブロッカー、その下に待たされているセッションを並べます。循環も検出します。

ヘルス:インデックスとbloatの事実

テーブルサイズ、未使用インデックス、インデックスのない外部キー、重複インデックス、孤児行、dead rows、bloatの推定。事実だけを出し、助言はしません。

依存関係

外部キーのグラフから、安全なTRUNCATEの順番(と、その逆の投入順)を出します。外部キーの循環も名指しします。何も消しません。

拡張機能とオブジェクト

導入済みの拡張と導入できる拡張、データベース・スキーマ・ロールの一覧、postgresql.confのエディタ。変更は確認ゲートつきです。

バックアップ・リストア・レプリケーション

破壊的な変更の前に、自動でスナップショットを取ります。ダンプの復元はストリーミングで、レプリケーションの準備状況やスロットも見られます。

対応と、あえてやらないこと

制約こそがプロダクトです。

対応するDB

  • PostgreSQL
  • MySQL 8.0以上
  • 同じパネルが、どちらでも動く
  • MySQLに無い機能は「対象外」と表示

あえてやらないこと

  • AIなし:スキーマを第三者へ送らない
  • SaaSなし:DBの認証情報が外に出ない
  • クリックしたコマンドだけを、推測なしで実行

安全のための既定

  • SQLランナーは読み取り専用
  • DDLは2秒のlock_timeout
  • 破壊的な変更の前に自動スナップショット
  • ローカル限定のUI

仕組み

  • フロント:htmx + Alpine.js
  • バックエンド:Django
  • 管理用DB:SQLite
  • 実行:Docker

無料・オープンソース

cli2ui

やろうと決めて、3分後にはテーブルを眺めている。

無料

ローカル完結・Docker

MITライセンス · ソースはGitHub
認証のない、ローカル完結の設計です。公開インターネットには晒さないでください。

  • psql / mysqlの操作を、ワンクリックで
  • 押す前に結果を見る(制約違反・削除順・読み取り専用)
  • インデックスラボ・スケール・EXPLAIN差分
  • アクティビティ・ロック・ヘルス
  • サンプルデータ同梱、接続フォームは配線済み
  • docker run だけでも起動できる(サンプルDB付きは clone して docker compose up)
GitHub で導入する

まずは、clone して docker compose up から。

git clone https://github.com/MR-TABATA/cli2ui cd cli2ui docker compose up