2026-08-16
· Dylan YuCloudflare D1をデスクトップから管理する(ダッシュボードなしで)
Cloudflare D1はエッジで動くSQLiteですが、Webダッシュボードは日常的な作業には遅すぎます。D1データベースをローカルから管理する方法——クエリの実行、データの閲覧、編集をデスクトップアプリから行い、クラウドの往復をゼロにするアプローチを解説します。
ここ半年ほど、いくつかのサイドプロジェクトと本番アプリでCloudflare D1を使っています。そして毎回、データを実際に確認したいとき——単に一度きりのクエリを走らせてJSONを目で追うのではなく、ちゃんとデータを見たいとき——イライラさせられます。Webダッシュボードは、データベースを初めてセットアップするときには十分です。しかし、深夜11時にスキーママイグレーションをデバッグしていて、各ページの読み込みに2秒待たされながら200行をページ送りしたいだけ、という場面には向いていません。
いつも引っかかるのがこれです。D1はSQLiteです。文字通りSQLiteです。データがSQLiteファイルとしてCloudflareのエッジロケーションにレプリケートされる、というのがD1の売りです。なぜ私は、Webブラウザと祈りが必要な、どこかの特殊なクラウドデータベースのように扱っているのでしょうか。
この記事は、半年前にあればよかったと思えるガイドです。D1とは実際に何なのか、なぜダッシュボードが日常作業に向かないのか、そしてD1データベースをローカルから管理する3つの現実的な方法——今実際に使っている方法も含めて——を順に解説します。
Cloudflare D1とは実際に何か
まずはアーキテクチャを整理しておきましょう。D1の使い方に関わる重要な部分だからです。
D1はCloudflareのサーバーレスSQLiteデータベースです。ストレージ層はSQLiteです——実際のファイルフォーマット、実際のクエリエンジン、実際のB-treeストレージを使っています。D1データベースを作成すると、CloudflareはSQLiteデータベースファイルをプロビジョニングし、エッジネットワーク全体にレプリケートします。Workerがクエリを実行するときは、そのSQLiteファイルの最も近いレプリカに対して実行されます。
コンピュート層はWorkersです。PostgresにTCP接続文字列で接続するような方法でD1に接続することはありません。代わりに、D1データベースをWorkerにバインドし、Workerの中でenv.DB.prepare("SELECT * FROM users").all()のようなメソッドを呼び出します。Workerはユーザーの近くのエッジで動き、D1のレプリカもそこにあります。
Workers以外でのアドホックなクエリには、Cloudflareが2つの方法を用意しています。
- Wrangler CLI ——
wrangler d1 executeとwrangler d1 queryで、ターミナルからD1 APIに対してクエリを実行します。 - D1 REST API —— SQLを受け取ってJSONを返すHTTPエンドポイントです。HTTPを話せるものなら何からでも叩けます。
どちらもCloudflareのAPIを経由し、SQLiteファイルに直接アクセスするわけではありません。本番のD1データベースに対して生のSQLiteファイル接続を取得する方法はありません——それがサーバーレスのトレードオフです。しかしクエリのセマンティクスはSQLiteのセマンティクスです。SQLiteを知っていれば、D1も分かります。
これがツール選びの鍵になる洞察です:D1はHTTP経由でアクセスするSQLiteです。 つまり、D1のREST APIを話せるツールなら、SQLiteのような体験を提供できますし、SQLiteの知識はそのまま活かせます。
Webダッシュボードの問題点
Cloudflareの管理パネルにはD1用のWebダッシュボードがあります。ログインしてデータベースに移動すると、クエリボックスと結果テーブルが表示されます。動きます。存在しないふりはしません。しかし、日常的なデータベース作業——アプリを構築・保守するときに行うような作業——においては、実際の問題があります。
すべてのクエリがネットワークの往復になります。 クエリを入力し、実行ボタンを押し、リクエストがCloudflareのAPIに到達して実行され、戻ってくるのを待ちます。良い接続環境で300〜500ms。ホテルのWi-Fiならもっとかかります。データを探索しているとき——クエリを実行し、結果を見て、クエリを少し調整し、また実行する——このレイテンシはすぐに積み上がります。ダッシュボードのクエリが返ってくるのを待った時間のほうが、データについて考えた時間より長いことすらありました。
まともなブラウジング体験がありません。 結果テーブルは基本的なHTMLテーブルです。カラムのドラッグによる並べ替えはできません。カラムのリサイズもできません。横スクロール時に最初のカラムを固定することもできません。行をクリックして詳細ビューで展開することもできません。ORDER BY句を書き直さずにカラムヘッダーをクリックしてソートすることもできません。小さなことに聞こえるかもしれませんが、「データを探索している」状態と「ツールと格闘している」状態の差は、まさにこういうところで生まれます。
フラットなテーブル以外のビューがありません。 D1データベースにサポートチケットのテーブルがあれば、ステータスごとにグループ化したカンバン形式で見たいかもしれません。商品データがあれば、画像付きのギャラリービューが欲しいかもしれません。イベントデータがあれば、チャート付きのダッシュボードが欲しいでしょう。ダッシュボードはこれらをいずれも提供しません。テーブルか、さもなければ何もなし、です。
AI統合がありません。 私はSQLの作成やデバッグにAIアシスタント——Claude、Cursor、Windsurf——を使っています。Webダッシュボードでは、AIツールが私のスキーマを見たりデータにクエリを投げたりする方法がありません。チャットにスキーマ定義を手動でコピーし、自分でクエリを実行し、結果をまたコピーし直す必要があります。面倒です。
オフライン対応ではありません。 ダッシュボードはWebアプリです。インターネットがなければダッシュボードもありません。フライトや電車に乗る機会が十分にある私は、これが重要だと知っています。
コンテキストスイッチの問題。 ダッシュボードは他の47個のブラウザタブと一緒に1つのタブで生きています。エディタでアプリを開発しているとき、ブラウザに切り替え、正しいタブを探し、データベースに戻る必要があります。摩擦です。
ダッシュボードは、データベースの作成、バインディングの設定、月1回のクエリ実行には適しています。しかし日常使いには向いていません。D1はSQLiteなのですから、過去15年で作られたデスクトップ用SQLiteブラウザより劣るWeb UIに甘んじる必要はありません。
オプション1:Wrangler CLI
Workers以外からD1にアクセスする公式の方法がWrangler、CloudflareのCLIツールです。Workersをデプロイしたことがあれば、すでにインストール済みでしょう。なければ、npmでインストールできます。
npm install -g wrangler
Cloudflareアカウントで認証します。
wrangler login
D1データベースの一覧を表示します。
wrangler d1 list
クエリを実行します。
wrangler d1 execute my-database --command "SELECT * FROM users LIMIT 10"
SQLファイルを実行することもできます。
wrangler d1 execute my-database --file ./migration.sql
さらにインタラクティブなクエリモードもあります。
wrangler d1 query my-database
これでREPLに入り、クエリを入力して結果を確認できます。
Wranglerは得意なことには優れています。スクリプト、マイグレーション、CI/CDパイプライン、ちょっとした一回きりのクエリです。私はデプロイスクリプトでマイグレーションを実行するのに使っています。信頼性が高く、スクリプト化しやすく、邪魔になりません。
Wranglerが苦手なのはブラウジングです。出力はターミナル内のフォーマット済みテキストです。SELECT COUNT(*) FROM usersには適しています。しかしSELECT * FROM usersで、usersが12カラムあって値を実際に読みたい場合には最悪です。行を視覚的にページ送りする方法も、行をクリックして展開する方法も、値をインラインで編集する方法もありません。ターミナルにいるのです。ターミナルは表形式データに向いていません。
ワークフローが「クエリを実行して数字を見て終わり」なら、Wranglerは完璧です。ワークフローが「テーブルを探索し、データの形を理解し、アプリを壊しているおかしな行を見つける」なら、Wranglerでは不満が残るでしょう。
オプション2:D1 REST API
ここからが面白い部分です。D1はREST APIを公開しているため、HTTPリクエストを送れるものなら何からでもクエリできます。これは聞こえるよりもずっと大きな意味を持ちます。
エンドポイントのフォーマットは以下の通りです。
https://api.cloudflare.com/client/v4/accounts/{account_id}/d1/database/{database_id}/query
CloudflareのAPIトークンで認証します(ダッシュボードのMy Profile > API Tokensで、D1権限を付与して作成します)。
curlの例です。
curl -X POST \
"https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/d1/database/$DATABASE_ID/query" \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"sql": "SELECT * FROM users LIMIT 10"}'
レスポンスはJSONです。
{
"result": [
{
"results": [
{ "id": 1, "email": "alice@example.com", "name": "Alice" },
{ "id": 2, "email": "bob@example.com", "name": "Bob" }
],
"success": true,
"meta": {
"served_by": "d1-micro",
"duration": 0.34,
"changes": 0,
"last_row_id": 0,
"rows_read": 2,
"rows_written": 0
}
}
],
"success": true,
"errors": [],
"messages": []
}
これが解放の鍵です。D1にはREST APIがあるため、どんなHTTPクライアントでもクエリできます。デスクトップアプリでもクエリできます。スクリプトでもクエリできます。AIツールでもクエリできます。WranglerやWebダッシュボードに限定されず、HTTPを話せるインターフェースなら何でも構築・利用できます。
REST APIはWranglerがサポートするすべてをサポートします。SELECT、INSERT、UPDATE、DELETE、CREATE TABLE、ALTER TABLE、sqlite_masterによるスキーマイントロスペクション、全部です。HTTP越しのSQLiteです。
生のAPIだけでは日常的なインターフェースとしては優れていません——テーブルをブラウズするためにcurlコマンドを書きたい人はいないでしょう。しかし、より良いツールの基盤になります。それが次にお見せしたいことです。
オプション3:ローカルデスクトップ管理パネル
これが、私が日々実際に使っている方法です。Webダッシュボード経由でD1にクエリを投げる代わりに、ローカルデスクトップアプリをD1のREST APIに接続し、本格的な管理パネルを手に入れます。DB BrowserのようなツールでSQLiteが何年も前から持っていたようなものですが、API経由でD1データベースに対して動きます。
私が使っているのはBaseVoltです。macOSとWindows向けのローカルファーストなデスクトップアプリで、どんなデータベースにも完全な管理パネルを提供します。SQLite、PostgreSQL、MySQL、Cloudflare D1に対応しています。この記事はD1についてなのでD1のワークフローを説明しますが、他のデータベースも同じアプリで扱えます。
この領域には他の選択肢もあります——TablePlusは設定を工夫すればD1に対応しますし、REST APIとHTTPクライアントで自作することも常に可能です。私がBaseVoltを使っているのは、ビュー(カンバン、ギャラリー、ダッシュボード)を提供し、AI統合用のMCPサーバーを持っているからです(後述します)。しかし重要なのは、デスクトップアプリをD1のREST APIに接続するという一般的なアプローチです。自分のワークフローに合ったツールを選んでください。
ステップ1:D1のAPI認証情報を取得する
Cloudflareから3つの情報が必要です。
- Account ID —— Cloudflareダッシュボードで確認できます。ログイン時のURLに含まれているか、アカウント概要ページにあります。16進数文字列です。
- Database ID —— 接続したいD1データベースのIDです。
wrangler d1 listでデータベースとそのIDを確認するか、ダッシュボードのD1データベースの設定で確認できます。 - API Token —— My Profile > API Tokensでトークンを作成します。D1アクセスには最低でも「D1 Edit」権限が必要です(読み取り専用なら「D1 Read」)。アカウントにスコープを限定してください。
これらを手元に用意しておいてください。すぐに必要になります。
ステップ2:BaseVoltに接続する
BaseVoltを開き、新しいデータソースを追加します。タイプとして「Cloudflare D1」を選択します。BaseVoltが上記の3つの認証情報——Account ID、Database ID、API Token——を求めてきます。入力して、接続ボタンを押します。
BaseVoltはAccount IDとDatabase IDからD1のRESTエンドポイントを構築します。
https://api.cloudflare.com/client/v4/accounts/{account_id}/d1/database/{database_id}/query
そしてAPIトークンをBearer認証ヘッダーとして送信します。以上です。中間サーバーはなく、BaseVoltはあなたのマシンから直接CloudflareのAPIに通信します。APIトークンはローカルに保存され、第三者のサービスには送信されません。
接続すると、BaseVoltはsqlite_masterにクエリを投げてスキーマをイントロスペクトし、テーブル一覧を取得します。数秒でサイドバーにテーブルが表示されます。
ステップ3:テーブルの閲覧、クエリの実行、ビューの構築
ここがデスクトップアプリの価値が発揮される場所です。接続すると、以下が手に入ります。
本格的なテーブルブラウザ。 テーブルをクリックすると、グリッドに行が表示されます。カラムのリサイズや並べ替えが可能です。カラムヘッダーをクリックしてソートできます。クエリを再実行せずに結果をページ送りできます。行をクリックすると詳細パネルにすべてのフィールドが表示されます。セルをダブルクリックして値をインライン編集できます。基本的なデータベースツールの機能ですが、Webダッシュボードと比べれば天と地ほどの差があります。
SQLエディタ。 シンタックスハイライト、テーブル名とカラム名のオートコンプリート、クエリ履歴を備えた本物のエディタです。クエリを実行すると、下に結果が表示されます。少し調整して再実行すると、新しい結果が表示されます。レイテンシはD1 APIの往復と同じ——ダッシュボードと同じ——ですが、インターフェースが邪魔をしないので、待つのはレイテンシだけで、UIのロードは待ちません。
ビュー。 これが私を惹きつけた部分です。BaseVoltはどのテーブルにも異なるビューを構築できます。
- Grid view —— デフォルト。スプレッドシート風のテーブルです。
- Gallery view —— 各行をカードとして表示します。画像やファイルを含むデータに適しています。
- Kanban view —— ステータスフィールドで行をグループ化します。チケット、タスク、ワークフローのあるものに適しています。
- Dashboard view —— データから構築したチャートやメトリクスです。モニタリングに適しています。
D1のサポートチケットテーブルには、ステータスでグループ化したカンバンビューを作っています。イベントテーブルには、今日のイベント数とタイプ別の棒グラフを含むダッシュボードを作っています。これらはWebダッシュボードでは絶対に作れないビューです。そもそも不可能なのです。
これらはすべてローカルで動きます。クエリはREST API経由でD1に送られますが、インターフェース——グリッド、カンバンボード、チャート——はすべてあなたのマシンでレンダリングされます。クラウドSaaSがUIをレンダリングするわけではありません。
ステップ4:MCPサーバーでAIアシストによるスキーマ作業を行う
ここが驚きだった部分です。BaseVoltには組み込みのMCP(Model Context Protocol)サーバーがあります。MCPは、Claude、Cursor、WindsurfのようなAIアシスタントが外部ツールに接続するための標準規格です。BaseVoltのMCPサーバーを起動しておくと、AIアシスタントがデータベーススキーマを確認し、クエリを実行できるようになります。
実際にどういうことかお見せします。Cursorでアプリを開発中とします。usersテーブルに新しいカラムを追加したい。Cursorにこう伝えます:「usersテーブルにlast_login_atカラムを追加して、Workerコード内の関連するクエリも更新して。」CursorはBaseVoltのMCPサーバーに接続しているため、以下が可能です。
- 現在のスキーマを読み取る(usersテーブルとそのすべてのカラムを認識する)。
- ALTER TABLEマイグレーションを生成する。
- MCPサーバー経由でD1に対して実行する。
- Workerコードを新しいカラムを参照するように更新する。
スキーマをチャットにコピーする必要はありません。マイグレーションを手動で実行して報告する必要もありません。AIアシスタントはBaseVolt経由のライブ接続があるため、ループ全体をこなします。
デバッグにも使えます。「なぜこのユーザーのアカウントが非アクティブと表示されるのか?」と聞くと、AIがusersテーブルにクエリを投げ、該当行を確認し、関連テーブルをチェックして原因を特定します——すべてMCP接続経由です。手動でクエリを投げれば10分かかる作業が、1回の会話で終わります。
MCPサーバーはBaseVoltの一部としてローカルで動きます。AIアシスタントはlocalhostでそれに接続します。AI統合のためにデータがクラウドサービスを経由することはありません——AIツールがBaseVoltに話し、BaseVoltがD1に話し、ループ内のクラウドはCloudflareだけです。
ローカルファーストがD1にとって重要な理由
こういう反論を聞いたことがあります:「D1のデータはすでにCloudflareのクラウドにある。データベースツールもクラウドSaaSでいいじゃないか。」
重要なのは、その間にあるものです。クラウドホスト型のデータベース管理ツール——D1データベースに接続するWeb SaaS——を使うと、データはそのSaaSのサーバーを経由します。クエリはブラウザから彼らのサーバーへ、そこからCloudflareへ、そして彼らのサーバーを経由してブラウザに戻ります。その中間サーバーはあなたのSQL、結果、スキーマを見ます。設計上のMan-in-the-middleです。
ローカルファーストなデスクトップアプリを使うと、クエリはあなたのマシンから直接CloudflareのAPIに送られます。中間サーバーはありません。データを見るのはあなたとCloudflareだけであり、Cloudflareはそもそも自分たちのデータベースとしてデータを保持しています。
これは信頼の問題だけではありません——レイテンシと信頼性にも関わります。ローカルアプリにはダウンするサーバーがありません。レートリミットやDDoSを受けるバックエンドもありません。ロックアウトされるログインシステムもありません。アプリを開けばD1に接続され、作業できます。唯一の依存関係はCloudflareのAPIが稼働していることであり、それはすでに持っている依存関係です。
ローカルファーストはまた、ネットワークを必要としない部分についてはオフライン対応を意味します。BaseVoltはスキーマと最近のクエリ結果をローカルにキャッシュします。インターネットが切れても、スキーマを確認し、過去のクエリ結果をレビューし、次のマイグレーションを計画できます。新しいクエリは実行できませんが、考えることはできます——そしてデータベース作業の多くはクエリではなく思考です。
原則はシンプルです。データがクラウドにあるのは、グローバルにアクセス可能である必要があるからです。ツールまでクラウドにある必要はなく、そこに置いても中間業者が増えるだけです。
比較表
各オプションの比較です。4つすべてを使った上での正直な評価です。
| Wrangler CLI | D1 REST API | Web Dashboard | BaseVolt | |
|---|---|---|---|---|
| セットアップ時間 | 5分(npm install + login) | 10分(APIトークン作成) | 0分(ダッシュボードに既にある) | 5分(インストール + 認証情報入力) |
| ブラウジング体験 | 不十分(ターミナルのテキスト出力) | なし(生のHTTP) | 基本(HTMLテーブル、装飾なし) | 完全(グリッド、詳細ビュー、インライン編集) |
| クエリ速度 | 高速(直接API呼び出し) | 高速(直接API呼び出し) | 低速(往復 + UIレンダリング) | 高速(直接API呼び出し、ローカルUI) |
| オフライン | 不可 | 不可 | 不可 | 部分(スキーマ + キャッシュ済み結果) |
| AI統合 | なし | 手動(コピー&ペースト) | なし | 組み込みMCPサーバー |
| ビュー/ダッシュボード | なし | なし | なし | Grid、gallery、kanban、dashboard |
| コスト | 無料 | 無料 | 無料 | Free tier(2ソース)、Pro $99/年 |
| 最適な用途 | スクリプト、マイグレーション、CI/CD | カスタム統合 | たまの管理作業 | 日常的なデータベース作業 |
この表についていくつか補足します。
WranglerとREST APIの速度が同じなのは、どちらも同じCloudflare APIを叩くからです。違いはインターフェースです——Wranglerはターミナルを提供し、REST APIは何も提供しません(自分でインターフェースを構築します)。
Webダッシュボードが「遅い」のは、CloudflareのAPIが遅いからではなく、すべてのAPI呼び出しの上にWebアプリのレンダリングオーバーヘッドが乗るからです。結果の各ページには往復と完全なUIの再レンダリングが必要です。
BaseVoltのクエリ速度はWranglerと同じです——同じAPIを叩いているからです。違いは、結果がローカルUIでレンダリングされ、Webページのロードを待つ必要がないことです。
コストの行について。Wrangler、REST API、ダッシュボードはすべてCloudflareの公式ツールなので無料です。BaseVoltにはFree tierがあり、最大2つのデータソースに対応します——D1だけ、あるいはD1とPostgres 1つずつなら、ずっとFree tierで使えます。Proは$99/年で、クロスデバイス同期が追加されます。私はラップトップとデスクトップ間でクエリ履歴と保存済みビューを同期するのに使っています。
どの場面で何を使うか
1つ選んで固定する必要はありません。私は作業内容に応じてこれらすべてを使い分けています。私の判断基準を紹介します。
Wrangler CLIを使う場面:
- デプロイスクリプトでマイグレーションを実行するとき。
- CI/CDパイプラインでプログラム的にSQLを実行するとき。
- ターミナルからさっと一回きりのクエリを実行する必要があり、すでにWranglerがインストールされているとき。
- データベースの作成や削除をするとき。
D1 REST APIを使う場面:
- カスタム統合(スクリプト、ボット、内部ツール)を構築するとき。
- Wranglerがない言語や環境からD1にクエリを投げたいとき。
- 独自の管理ツールを構築していて、生のAPIが必要なとき。
Webダッシュボードを使う場面:
- 初めてD1データベースをセットアップするとき。
- Workersのバインディングを設定するとき。
- 課金や使用量メトリクスを確認するとき。
- 自分のマシンではなく、何もインストールできない環境にいるとき。
ローカルデスクトップ管理パネル(BaseVoltなど)を使う場面:
- 日常的なデータベース作業——テーブルのブラウズ、データの探索、問題のデバッグ——をしているとき。
- D1データに対してビュー(カンバン、ギャラリー、ダッシュボード)が欲しいとき。
- MCPサーバー経由でAIアシストによるスキーマ管理をしたいとき。
- オフラインや接続の悪い環境で、レスポンシブなUIが欲しいとき。
- D1を他のデータベース(Postgres、MySQL、ローカルSQLite)と並行して管理し、1つのツールでまとめたいとき。
私が落ち着いたパターンはこうです。マイグレーションとスクリプトにはWrangler、アカウントレベルの管理にはWebダッシュボード、それ以外にはBaseVolt。おそらくD1の時間の80%をBaseVolt、15%をWrangler、5%をダッシュボードで過ごしています。
まとめ
Cloudflare D1はエッジで動くSQLiteです。アプリにとっては素晴らしいアーキテクチャです。しかしCloudflareが管理用に提供するツール——WebダッシュボードとCLI——はたまの用途向けであって、日常作業向けではありません。毎日D1データベースに触れるなら、本物のインターフェースが欲しいはずです。
良いニュースは、D1のREST APIのおかげでCloudflareのツールに縛られないことです。どんなHTTPクライアントでもデータベースにクエリできます。そしてBaseVoltのようなローカルファーストなデスクトップアプリは、そのAPIを完全な管理パネル——グリッドビュー、カンバンボード、ダッシュボード、インライン編集、AI統合——に変え、すべてあなたのマシンで動かし、クエリは直接Cloudflareに送られます。
私の言葉を信じる必要はありません。Free tierは2つのデータソースに対応するので、D1で試して自分のワークフローに合うか確認するには十分です。
basevolt.app で試してみてください —— サインアップ不要、クレジットカード不要です。
エッジで何かを構築していて、データベースツールについて語りたいなら、X でフォローしてください。