QueryFolio — SQL クライアントデスクトップアプリ
2026-07-10 (21 days ago)

QueryFolio は、複数のデータベースエンジンを 1 つのアプリで扱うために自作した SQL クライアントのデスクトップアプリです。MySQL / PostgreSQL / SQLite / DuckDB といった SQL 系のエンジンに加えて、Redis・Elasticsearch・DynamoDB にも同じアプリから接続できます。
- 最新版のダウンロード (macOS / Windows): https://github.com/cyberneura/queryfolio/releases/latest
デモ動画
作った理由
複数のデータベースエンジンを 1 つのアプリで扱いたい、というのが出発点でした。リレーショナルデータベースだけでなく、Redis や Elasticsearch、DynamoDB のように問い合わせの書き方がまったく違うエンジンも、同じウインドウ・同じ操作で触れるようにしています。設計方針は「軽い・複数 DB 対応・接続情報を安全に扱える・AI で補助してくれる」の 4 点です。
主な機能
- マルチエンジン対応 — MySQL / PostgreSQL / SQLite / DuckDB の SQL 系に加え、Redis / Elasticsearch / DynamoDB にも 1 つのアプリで接続。エンジンごとにエディタの言語と実行単位が切り替わります (Redis は 1 行 = 1 コマンド、Elasticsearch は Kibana Console 風のリクエストブロック、DynamoDB は PartiQL、DuckDB はローカルファイルを開く SQL エンジン)。対応していない機能はエンジンの能力宣言をもとに UI ごと隠れるので、使えないボタンが並ぶことがありません。
- 接続情報を YAML で管理 — sql-agent-mcp-server 互換フォーマット。シークレットは 1Password に置いたまま、
op read "op://..."のような取得コマンド経由で遅延ロードでき、パスワードを設定ファイルに直書きせずに済みます。 - SSH トンネル — known_hosts 検証付きのローカルポートフォワードで、踏み台越しの DB にも接続。
~/.ssh/configの Host 名を指定すれば ProxyJump による多段トンネルも使えます。 - スキーマ補完 — テーブル名・カラム名を補完。スキーマブラウザ (TABLES ペイン) はカラムを遅延ロード。Elasticsearch ではインデックスと mapping のフィールド、DynamoDB ではテーブルとキー属性が同じペインに出ます。
- クエリの安全ガード — 接続ごとに
readonly: trueを指定すると、INSERT / UPDATE / DELETE / DDL (CTE でラップした DML 含む) を拒否。LIMIT を書き忘れた SELECT には自動でLIMITを付与 (デフォルト 500)。Redis や Elasticsearch では読み取りコマンド・読み取り API のホワイトリストとして同じガードが働きます。 - psql 風メタコマンド —
\l\dt\dv\dn\du\d [table]をエンジン別のカタログクエリに変換 (MySQL / SQLite でも可能な範囲で対応)。 - クエリ履歴 — 接続ごとにローカル保存。SQL には機密が含まれ得るため、ファイルは制限付きパーミッションで保存。
- 結果の扱い — タブ・ピン留め・セルインスペクタ・CSV / TSV / JSON コピー (数式インジェクション対策込み)。実行中のクエリはキャンセル可能。
- AI 支援 (OpenAI) — 自然言語からの SQL 生成、エラー時の Fix with AI、EXPLAIN プランの解説とインデックス提案、選択 SQL の解説。生成された SQL はエディタに挿入されるだけで、自動実行はしません。送信するのはスキーマ (テーブル名・カラム名)・エンジン方言・SQL 文・実行計画のみで、クエリ結果は一切送りません。
セキュリティ設計で気をつけたこと
SQL クライアントは扱う情報が機微なので、いくつか方針を決めています。API キーはフロントエンド (WebView) 側に一切渡さず、Rust バックエンドの中だけで扱います。AI に投げるのはスキーマ構造とクエリ文だけで、実データ (クエリ結果) は送りません。接続パスワードは 1Password に置いたまま参照でき、設定ファイルに平文で残さずに済むようにしています。