すべての記事

2026-08-16

· Dylan Yu
Cloudflare D1SQLiteedgelocal-first

Cloudflare 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つの方法を用意しています。

  1. Wrangler CLI —— wrangler d1 executewrangler d1 queryで、ターミナルからD1 APIに対してクエリを実行します。
  2. 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、PostgreSQLMySQL、Cloudflare D1に対応しています。この記事はD1についてなのでD1のワークフローを説明しますが、他のデータベースも同じアプリで扱えます。

この領域には他の選択肢もあります——TablePlusは設定を工夫すればD1に対応しますし、REST APIとHTTPクライアントで自作することも常に可能です。私がBaseVoltを使っているのは、ビュー(カンバン、ギャラリー、ダッシュボード)を提供し、AI統合用のMCPサーバーを持っているからです(後述します)。しかし重要なのは、デスクトップアプリをD1のREST APIに接続するという一般的なアプローチです。自分のワークフローに合ったツールを選んでください。

ステップ1:D1のAPI認証情報を取得する

Cloudflareから3つの情報が必要です。

  1. Account ID —— Cloudflareダッシュボードで確認できます。ログイン時のURLに含まれているか、アカウント概要ページにあります。16進数文字列です。
  2. Database ID —— 接続したいD1データベースのIDです。wrangler d1 listでデータベースとそのIDを確認するか、ダッシュボードのD1データベースの設定で確認できます。
  3. 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サーバーに接続しているため、以下が可能です。

  1. 現在のスキーマを読み取る(usersテーブルとそのすべてのカラムを認識する)。
  2. ALTER TABLEマイグレーションを生成する。
  3. MCPサーバー経由でD1に対して実行する。
  4. 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 CLID1 REST APIWeb DashboardBaseVolt
セットアップ時間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 でフォローしてください。

BasevoltBasevolt

Basevoltをお試しください — PostgreSQL、MySQL、SQLite、Cloudflare D1用の無料ローカルファーストデータベース管理パネル。

Basevoltを無料でダウンロード