d1-database
Cloudflare D1は、サーバーレス環境でSQLiteデータベースをエッジで利用可能にし、スキーマ設定、クエリ実行、移行、Workersとの連携、Drizzle ORMなどを通して、高速なデータベース処理を可能にするSkill。
📜 元の英語説明(参考)
Build serverless applications with Cloudflare D1 — SQLite at the edge. Use when someone asks to "serverless database", "Cloudflare D1", "SQLite at the edge", "database for Workers", "edge database", or "serverless SQL". Covers schema setup, queries, migrations, Workers integration, and Drizzle ORM.
🇯🇵 日本人クリエイター向け解説
Cloudflare D1は、サーバーレス環境でSQLiteデータベースをエッジで利用可能にし、スキーマ設定、クエリ実行、移行、Workersとの連携、Drizzle ORMなどを通して、高速なデータベース処理を可能にするSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o d1-database.zip https://jpskill.com/download/14809.zip && unzip -o d1-database.zip && rm d1-database.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/14809.zip -OutFile "$d\d1-database.zip"; Expand-Archive "$d\d1-database.zip" -DestinationPath $d -Force; ri "$d\d1-database.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
d1-database.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
d1-databaseフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Cloudflare D1
概要
D1 は Cloudflare のサーバーレス SQLite データベースです。Worker と並んでエッジで実行されます。接続のオーバーヘッドはゼロ(Worker と同じデータセンターに存在するため)、SQLite のクエリ構文、自動レプリケーション、クエリごとの従量課金制です。読み込みが多いワークロード、コンテンツサイト、レイテンシーが重要なアプリケーションに最適です。
どのような時に使うか
- Cloudflare Workers で構築しており、データベースが必要な場合
- 読み込みが多いアプリケーション(ブログ、コンテンツサイト、API)
- グローバル分散された SQLite のシンプルさを求めている場合
- 接続プーリングの煩わしさがないサーバーレスアプリケーション
- データベースのレイテンシーが重要なエッジファーストアプリケーション
手順
セットアップ
# D1 データベースを作成
npx wrangler d1 create my-database
# wrangler.toml に追加
# wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "my-database"
database_id = "xxxx-xxxx-xxxx"
スキーマとマイグレーション
# マイグレーションを作成
npx wrangler d1 migrations create my-database init
-- migrations/0001_init.sql
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
created_at TEXT DEFAULT (datetime('now'))
);
CREATE TABLE posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
content TEXT NOT NULL,
author_id INTEGER NOT NULL REFERENCES users(id),
published BOOLEAN DEFAULT FALSE,
created_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX idx_posts_author ON posts(author_id);
CREATE INDEX idx_posts_published ON posts(published);
# マイグレーションを適用
npx wrangler d1 migrations apply my-database
Worker でのクエリ
// src/index.ts — D1 を使用した Cloudflare Worker
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
if (url.pathname === "/api/posts" && request.method === "GET") {
const { results } = await env.DB.prepare(
`SELECT posts.*, users.name as author_name
FROM posts
JOIN users ON posts.author_id = users.id
WHERE posts.published = TRUE
ORDER BY posts.created_at DESC
LIMIT ?`
).bind(20).all();
return Response.json({ posts: results });
}
if (url.pathname === "/api/posts" && request.method === "POST") {
const body = await request.json();
const result = await env.DB.prepare(
"INSERT INTO posts (title, content, author_id) VALUES (?, ?, ?) RETURNING *"
).bind(body.title, body.content, body.authorId).first();
return Response.json({ post: result }, { status: 201 });
}
return new Response("Not found", { status: 404 });
},
};
Drizzle ORM の使用
// src/db/schema.ts — D1 用の Drizzle スキーマ
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
export const users = sqliteTable("users", {
id: integer("id").primaryKey({ autoIncrement: true }),
email: text("email").notNull().unique(),
name: text("name").notNull(),
});
export const posts = sqliteTable("posts", {
id: integer("id").primaryKey({ autoIncrement: true }),
title: text("title").notNull(),
content: text("content").notNull(),
authorId: integer("author_id").notNull().references(() => users.id),
published: integer("published", { mode: "boolean" }).default(false),
});
// src/index.ts — D1 で Drizzle を使用
import { drizzle } from "drizzle-orm/d1";
import { eq } from "drizzle-orm";
import * as schema from "./db/schema";
export default {
async fetch(request: Request, env: Env) {
const db = drizzle(env.DB, { schema });
const publishedPosts = await db.query.posts.findMany({
where: eq(schema.posts.published, true),
with: { author: true },
orderBy: (posts, { desc }) => [desc(posts.id)],
limit: 20,
});
return Response.json({ posts: publishedPosts });
},
};
例
例 1: エッジでブログ API を構築する
ユーザープロンプト: 「投稿とコメントのために、Cloudflare Workers と D1 を使用してブログ API を作成してください。」
エージェントは、D1 スキーマ、マイグレーション、Worker 内の CRUD エンドポイント、および Drizzle ORM 統合を作成します。
例 2: D1 を使用したユーザー認証
ユーザープロンプト: 「メール/パスワード認証で D1 にユーザーアカウントを保存します。」
エージェントは、ユーザーテーブル、Web Crypto API を使用したパスワードハッシュ化、セッション管理、および認証ミドルウェアを作成します。
ガイドライン
- SQLite 構文 — D1 は内部的には SQLite です
.bind()を使用したプリペアドステートメント — SQL インジェクションを防止します- 単一行には
.first()、複数行には.all()— クエリメソッド - Wrangler 経由のマイグレーション — バージョン管理されたスキーマの変更
- リードレプリカは自動 — D1 はグローバルにレプリケートされます
- 書き込みレイテンシーは高め — 書き込みはプライマリに送信されます。読み込みはどこでも高速です
- 5MB の行制限 — 大きな BLOB には向きません
- 無料枠: 500 万回の読み取り、10 万回の書き込み/日 — 小規模なアプリには十分です
- Drizzle ORM を推奨 — D1 アダプターによるタイプセーフなクエリ
- ローカル開発 —
wrangler devはローカル SQLite を使用します
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Cloudflare D1
Overview
D1 is Cloudflare's serverless SQLite database — runs at the edge alongside Workers. Zero connection overhead (it's in the same data center as your Worker), SQLite query syntax, automatic replication, and pay-per-query pricing. Perfect for read-heavy workloads, content sites, and applications where latency matters.
When to Use
- Building on Cloudflare Workers and need a database
- Read-heavy applications (blogs, content sites, APIs)
- Want SQLite simplicity with global distribution
- Serverless applications with no connection pooling headaches
- Edge-first applications where database latency matters
Instructions
Setup
# Create a D1 database
npx wrangler d1 create my-database
# Add to wrangler.toml
# wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "my-database"
database_id = "xxxx-xxxx-xxxx"
Schema and Migrations
# Create migration
npx wrangler d1 migrations create my-database init
-- migrations/0001_init.sql
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
created_at TEXT DEFAULT (datetime('now'))
);
CREATE TABLE posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
content TEXT NOT NULL,
author_id INTEGER NOT NULL REFERENCES users(id),
published BOOLEAN DEFAULT FALSE,
created_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX idx_posts_author ON posts(author_id);
CREATE INDEX idx_posts_published ON posts(published);
# Apply migrations
npx wrangler d1 migrations apply my-database
Queries in Workers
// src/index.ts — Cloudflare Worker with D1
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
if (url.pathname === "/api/posts" && request.method === "GET") {
const { results } = await env.DB.prepare(
`SELECT posts.*, users.name as author_name
FROM posts
JOIN users ON posts.author_id = users.id
WHERE posts.published = TRUE
ORDER BY posts.created_at DESC
LIMIT ?`
).bind(20).all();
return Response.json({ posts: results });
}
if (url.pathname === "/api/posts" && request.method === "POST") {
const body = await request.json();
const result = await env.DB.prepare(
"INSERT INTO posts (title, content, author_id) VALUES (?, ?, ?) RETURNING *"
).bind(body.title, body.content, body.authorId).first();
return Response.json({ post: result }, { status: 201 });
}
return new Response("Not found", { status: 404 });
},
};
With Drizzle ORM
// src/db/schema.ts — Drizzle schema for D1
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
export const users = sqliteTable("users", {
id: integer("id").primaryKey({ autoIncrement: true }),
email: text("email").notNull().unique(),
name: text("name").notNull(),
});
export const posts = sqliteTable("posts", {
id: integer("id").primaryKey({ autoIncrement: true }),
title: text("title").notNull(),
content: text("content").notNull(),
authorId: integer("author_id").notNull().references(() => users.id),
published: integer("published", { mode: "boolean" }).default(false),
});
// src/index.ts — Using Drizzle with D1
import { drizzle } from "drizzle-orm/d1";
import { eq } from "drizzle-orm";
import * as schema from "./db/schema";
export default {
async fetch(request: Request, env: Env) {
const db = drizzle(env.DB, { schema });
const publishedPosts = await db.query.posts.findMany({
where: eq(schema.posts.published, true),
with: { author: true },
orderBy: (posts, { desc }) => [desc(posts.id)],
limit: 20,
});
return Response.json({ posts: publishedPosts });
},
};
Examples
Example 1: Build a blog API on the edge
User prompt: "Create a blog API with Cloudflare Workers and D1 for posts and comments."
The agent will create D1 schema, migrations, CRUD endpoints in a Worker, and Drizzle ORM integration.
Example 2: User authentication with D1
User prompt: "Store user accounts in D1 with email/password auth."
The agent will create users table, password hashing with Web Crypto API, session management, and auth middleware.
Guidelines
- SQLite syntax — D1 is SQLite under the hood
- Prepared statements with
.bind()— prevent SQL injection .first()for single row,.all()for multiple — query methods- Migrations via Wrangler — version-controlled schema changes
- Read replicas are automatic — D1 replicates globally
- Write latency is higher — writes go to primary; reads are fast everywhere
- 5MB row limit — not for large blobs
- Free tier: 5M reads, 100K writes/day — generous for small apps
- Drizzle ORM recommended — type-safe queries with D1 adapter
- Local development —
wrangler devuses local SQLite