「Cloudflare Workersでアプリを作りたいけど、データをどこに保存すればいいの?」「KVだと検索ができなくて困る。でもRDSは高すぎる」——個人開発者からよく聞く悩みです。

その答えが Cloudflare D1 です。Cloudflareのエッジネットワーク上で動くSQLiteデータベースで、Workersからゼロレイテンシに近い速度でクエリできます。しかも無料枠が非常に充実しており、個人開発のマイクロSaaSなら月$0で本番運用できます。

この記事では、D1の基本概念からWorkersへの組み込み、Honoとの連携、マイグレーション管理、そして実際のSaaS構築パターンまで、実例コードを交えながら徹底解説します。

Cloudflare D1とは?

D1はCloudflareが提供するサーバーレスSQLiteデータベースです。2023年に正式GA(Generally Available)となり、2026年現在では多くの個人開発者・スタートアップが本番環境で採用しています。

D1の主な特徴

  • SQLite互換: 標準的なSQL構文がそのまま使える。既存のSQLiteスキーマを移植しやすい
  • Workersネイティブ: Workers内から env.DB.prepare() で直接クエリ。外部接続不要
  • エッジ分散読み取り: 世界中のCloudflareエッジで読み取りキャッシュが効く(レプリカ自動展開)
  • wrangler連携: CLIからマイグレーション管理・ローカル開発が完結
  • 寛大な無料枠: 読み取り500万行/日、書き込み10万行/日、容量5GB(2026年4月時点)

KV・R2・Durable Objectsとの使い分け

ストレージ 向いているユースケース SQLクエリ
D1 ユーザーデータ、記事、設定など構造化データ ✅ 可能
KV セッション、キャッシュ、フラグなどシンプルなkv ❌ 不可
R2 画像・動画・ファイルなどオブジェクトストレージ ❌ 不可
Durable Objects リアルタイム状態管理(チャット、ゲーム) △ 限定的

構造化データで検索・フィルタ・JOINが必要なら迷わずD1を選びましょう。

セットアップ:D1データベースを作る

前提条件

  • Cloudflareアカウント(無料)
  • Node.js 18以上 + wrangler 3以上

1. D1データベースを作成する

# wranglerでD1データベースを作成
npx wrangler d1 create my-app-db

# 出力例:
# ✅ Successfully created DB 'my-app-db'
# [[d1_databases]]
# binding = "DB"
# database_name = "my-app-db"
# database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

出力された [[d1_databases]] ブロックをそのまま wrangler.toml にコピーします。

2. wrangler.tomlに追記

name = "my-app"
main = "src/index.ts"
compatibility_date = "2026-01-01"

[[d1_databases]]
binding = "DB"
database_name = "my-app-db"
database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

3. スキーマを定義してマイグレーション

# migrations/0001_init.sql
CREATE TABLE IF NOT EXISTS users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  email TEXT NOT NULL UNIQUE,
  name TEXT NOT NULL,
  plan TEXT NOT NULL DEFAULT 'free',
  created_at TEXT NOT NULL DEFAULT (datetime('now'))
);

CREATE TABLE IF NOT EXISTS items (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  user_id INTEGER NOT NULL,
  title TEXT NOT NULL,
  content TEXT,
  created_at TEXT NOT NULL DEFAULT (datetime('now')),
  FOREIGN KEY (user_id) REFERENCES users(id)
);

CREATE INDEX idx_items_user_id ON items(user_id);
# リモート(本番)に適用
npx wrangler d1 execute my-app-db --remote --file=migrations/0001_init.sql

# ローカル開発環境に適用
npx wrangler d1 execute my-app-db --local --file=migrations/0001_init.sql

広告

ConoHa WING

初期費用無料の高速クラウドサーバー

最大3,500円還元

詳しく見る →