機能
機能の一覧ではなく、ひとつの作業として見てください
接続を作り、クエリを実行し、結果を編集し、ステータスバーを確認するまでを8つの場面でたどります。8枚とも実際の画面で、拡大も縮小もしていません。
01接続
まず接続を作ります
DB の種類を選び、ホスト、ポート、ユーザーを入力します。この時点で2つのことが決まります。パスワードをどこに保存するかと、この接続が本番サーバーかどうかです。

パスワードは OS のキーチェーンにだけ保存されます
macOS では Keychain、Windows では資格情報マネージャーに保存されます。平文で保存されることはありません。プロファイルファイルを開いても、パスワードは入っていません。
本番サーバーはひと目で区別できます
本番サーバーとして設定した接続は、タブとステータスバーの表示が変わります。いまどこに接続しているかを記憶に頼らずに済みます。
接続したまま放置しても切れません
サーバーの wait_timeout と interactive_timeout を読み取り、その半分の間隔で ping を送ります(15〜60秒の範囲)。ただし、自動再接続はあえて行いません。切れた接続を黙って復活させると、開いていたトランザクションが知らないうちに消えてしまうからです。SSH トンネルが必要なら、同じフォームの2番目のタブで設定します。
SSH トンネルは同じフォームの2番目のタブで
踏み台サーバーを経由する接続も、別のツールを使わずに同じ画面で設定できます。このタブの説明文も、何を入力するかより何がどこに保存されるかを伝えている点で接続フォームと同じです。

02capability
接続すると、画面がその DB に合わせて変わります
4種類の DB をひとつの画面に詰め込んでいるわけではありません。アダプターが接続するとこの DB で何ができるかを確認し、その結果に応じて画面の要素を表示したり隠したりします。そのため Redis ではクエリエディターではなくキーブラウザーが開きます。Redis は SQL ではなく KV だからです。
| DB | 種類 | 画面が変わるところ |
|---|---|---|
| MySQL · MariaDB | SQL | 基準となる画面 |
| PostgreSQL | SQL | DDL をトランザクション内でロールバックできます |
| SQLite | SQL | カラムの型変更はテーブルの作り直しになり、ユーザーと権限の画面はありません |
| Redis | KV | キーブラウザー、TTL、値の型ごとのビュー。クエリエディターはありません |

ウィンドウ全体です(1440×892)。一番下のステータスバーまで見せたいので切り取っていません。画像は等倍です。画面が狭いときは画像の中を横にスクロールしてください。
確認するのはラベルではなく画面の要素です
「SQL か KV か」のような大きな分類で決めることはしません。UI が知る必要があるのはこの画面要素が成り立つかどうかだけなので、capability もその単位で定義しています。
| capability | 確認する内容 |
|---|---|
transactional_ddl | DDL をトランザクション内でロールバックできるか |
supports_interactive_transaction | autocommit / commit / rollback に意味があるか |
supports_ttl | TTL の概念があるか |
supports_column_modify | 既存カラムの型を変更できるか |
supports_editable_resultset | F8(編集できる結果)を使えるか |
supports_multiple_result_sets | 複数の結果セットを返せるか |
supports_user_admin | ユーザーと権限の画面が成り立つか |
supports_schema_sync | スキーマ同期ツールが成り立つか |
value_types | KV の値の型。String、Hash、List、Set、ZSet、Stream |
このページに載っている画面は MySQL と Redis の2つだけです。PostgreSQL と SQLite の画面は、まだ実際のキャプチャがないため載せていません。ない画面を描いたり、ほかの画面にその名前を付けたりはせず、この2つについては上の表の文章だけで説明しています。
03実行
実行キーは3つあり、それぞれ意味が違います
大事なのはキーが3つあることではありません。同じクエリをどんな結果として受け取るかを3通りから選べることです。そしてその約束は、マニュアルではなくボタンの下の小さな文字に書いてあります。

- F9 ExecuteOne query at the cursor · read-only
- F8 Execute (Editable)Same query · asks for an editable result
- Ctrl+F9 Execute SelectionSelection only · does nothing without one
既定は安全な側です
F9 はカーソルのある文をひとつだけ実行し、結果は読み取り専用です。既定で LIMIT 1000 が付き、1行多く読んで「続きがあるか」を判定します。1,000万行をうっかり読み込むことはありません。間違えて実行しても、セッションを切らずに止められます。クエリのキャンセルは、すべてのアダプターに必須の項目です。
範囲を選択すると、3つ目のボタンがそれを伝えます

上の画像は元のサイズのままです(1044×112)。画面が狭いときは画像の中を横にスクロールしてください。
タブが増えません
F9 と F8 は同じ結果タブを上書きします。実行するたびにタブが増えていくことはありません。
04結果
結果が自分の状態を表示します
F9 で実行した結果です。ヘッダーにはすでに Read-only (F9) · F8 to edit(読み取り専用、編集するなら F8)と表示されています。編集系の操作も同じ理由で無効になっています。押してみて「なぜできないのか」と迷うことはありません。

amount decimal(10,2) です。小数点以下が2桁か4桁かを数える必要はありません。並び順が id ではなく placed_at に従っていることもそのまま見えます。F9 で実行したので、結果は読み取り専用です。上の画像は元のサイズのままです(1030×246)。画面が狭いときは画像の中を横にスクロールしてください。
編集が無効になる理由は型で決まっています
画面があいまいな表示をしない理由がここにあります。無効なときは次の5つのどれかで、その理由がそのまま表示されます。
| 理由 | どんな状況か |
|---|---|
| リクエストなし | F9 で実行しました。編集できる結果をリクエストしていません |
| アダプター未対応 | この DB のアダプターが編集できる結果セットに対応していません |
| 元のテーブルなし | 式や集計だけなので、書き戻す先がありません |
| 複数のテーブル | JOIN の結果なので、どのテーブルを更新するか決められません |
| 同じ元カラムが2回 | 自己結合です。違う行が知らないうちに更新されるのを防ぎます |
エクスポートは画面の行ではなく、クエリを再実行します
この違いは大切です。通常の実行には行数の上限があるので、画面の行をそのまま保存すると途中までの行だけがファイルになります。そのため、同じ文を上限なしで実行し直して書き出します。

05編集
編集するつもりのときだけ F8 を押します
同じ文を F8 で実行し直すと、結果のモードが変わります。ヘッダーの表示も変わります。

上の画像は元のサイズのままです(1030×298)。画面が狭いときは画像の中を横にスクロールしてください。
このひと手間が、この製品の考え方です
編集するには別のキーを押す必要があるので、うっかり本番データを変更してしまう操作が既定にはありません。毎日使う人にとって大事なのは、機能の数よりこうした既定値です。
06ステータスバー
残りはステータスバーに表示されます
結果のヘッダーが「この実行」についての表示なら、ステータスバーは「いまのウィンドウ」についての表示です。接続状態、選択範囲、カーソル位置、エンコーディングが表示されます。

07ショートカット
ここまでのキーは、すべて1つの定義ファイルから来ています
キー割り当ての元は docs/keymap-contract.json(v0.7)ひとつだけです。コンポーネントにショートカットを直接書くことは禁止されていて、定義と実装が一致しているかを機械的に照合しています。手作業で合わせたものではありません。
使う人にとっての結果は3つです。どの OS でも同じで、すべて変更でき(JSON でのエクスポートも可能)、バージョンが上がっても変わりません。
| 項目 | 値 |
|---|---|
| アクション | 102個(操作の数) |
| ショートカットの組み合わせ | Windows 114、macOS 126 |
| 有効な範囲 | global 66 · editor 19 · grid 9 · browser 6 · dialog 2 |
| 分類 | editor 18 · schema 18 · result 12 · connection 9 · common 9 · browser 6 · powertool 5 · tools 5 · statement 4 · query 3 · format 3 · panel 3 · user 3 · app 3 · favorites 1 |
macOS で変わるのはこれだけです
原則は「Ctrl の組み合わせを macOS でもそのまま使えるようにする」ことです。OS の予約キーとぶつかるところは、Windows のキーを消さずに代わりのキーを1つ追加しました。102個のアクションのうち macOS でキーが変わるのは13個で、そのうち12個は Windows のキーを残したまま Cmd の組み合わせを追加したものです。Windows のキーがなくなったのは終了の1つだけで、Alt+F4 は macOS にないため Cmd+Q にしました。
| 操作 | Windows | macOS | 理由 |
|---|---|---|---|
| 入力補完 | Ctrl+Space | Ctrl+Space · Option+Esc | macOS では Ctrl+Space が入力ソースの切り替えに使われています |
| Insert/Update ダイアログ | F11 | F11 · Cmd+F11 | F11 はシステムの「デスクトップを表示」に使われています |
| タブを閉じる | Alt+L | Alt+L · Cmd+W | macOS の慣例に合わせ、接続の切断と区別しています |
| コピー、貼り付け、保存、検索、取り消し | Ctrl+… | Ctrl+… · Cmd+… | 一般的な編集操作は Cmd の組み合わせも受け付けます |
| 終了 | Alt+F4 | Cmd+Q | Windows のキーを置き換えた唯一の項目です |
あらかじめお伝えしておきたいことがひとつあります。macOS では F1〜F12 が初期設定でメディアキーになっています。F9、F8、F12 を使うには、システム設定で「F1、F2 などのキーを標準のファンクションキーとして使用」をオンにしてください。
初回起動時の案内でこの設定をお知らせし、Fn との組み合わせにも対応しています。
08ひとつのウィンドウ
ここまでの画面は、ひとつのウィンドウの一部です
結果のヘッダー(04)、グリッド(05)、ステータスバー(06)は別々の画面ではありません。下の画像は、メインウィンドウの下半分を元の画像からそのまま切り出したものです。3つはこのようにつながっています。

元の画像(1440×892)の y=562 から下を切り出しています。エディターと結果パネルの境目で切っているので、行の途中ではなくパネルの境目で終わっています。画像は等倍です。画面が狭いときは画像の中を横にスクロールしてください。
左側はフィルター1つですべて絞り込めます
切り出した部分の上、左側にはオブジェクトブラウザーがあります。フィルターはテーブルだけを絞り込むのではありません。同じ文字でビュー、プロシージャ、トリガーまでまとめて絞り込めます。

ウィンドウのそのほかの構成
タブは3段階です。接続タブ、クエリタブ、結果タブの順に分かれています。このほかに接続マネージャー、テーブル構造エディター(カラム、インデックス、外部キー、オプション、SQL プレビュー)、ユーザーと権限の画面があります。
最後につくり
エラーメッセージまで日本語で表示されます
アプリの表示言語は韓国語、English、日本語の3つで、アプリ内で Alt+Shift+L を押して切り替えます。翻訳する文言は、どの言語も 1,499件で同じです。
多くのツールは画面だけを翻訳し、サーバーやエンジンのエラーは英語のまま表示します。DBerio はバックエンドが値を埋め込んだ文ではなく文の型と値を送るので、エラー文そのものが使う人の言語で組み立てられます。ただし、サーバーから返された原文(MySQL や PostgreSQL 固有のメッセージ)はそのまま表示します。それは私たちが翻訳すべき文ではないからです。
使っている技術
| レイヤー | 内容 |
|---|---|
| シェル | Tauri 2 で作っていて、Electron ではなく OS の WebView を使います。Windows では WebView2、macOS では WKWebView です。 |
| バックエンド | Rust(mysql_async、tokio-postgres、russh、keyring) |
| フロントエンド | React 19、TypeScript、Monaco エディター、Glide Data Grid、Zustand |
| IPC の型 | Rust の定義から TypeScript を生成します。手作業では合わせていません |
エディターは Monaco です。スキーマを読み込んで入力補完に使い、エディター内のキーも同じキーマップに合わせています。エクスポートはどこから実行するかで形式が違います。テーブルデータは CSV、TSV、JSON、SQL、Excel(xlsx)、結果セットは CSV、TSV、JSON です。DB への接続とライセンスの確認はコンパイル済みの Rust バイナリの中で行い、フロントエンドの JS には確認の処理を置いていません。


「何倍速い」といった数字を書いていないのは、測ったことがないからです。メモリ使用量も、起動時間も、クエリの速度も測定していません。いま言えるのは、OS の WebView を使うネイティブアプリだという構造上の事実までです。