Cloudflare D1 数据库操作
简介
Cloudflare D1 是 Cloudflare 推出的 Serverless SQL 数据库。底层基于 SQLite,但是由 Cloudflare 托管并分布在边缘节点。设计目标是:让开发者在 Cloudflare Workers(Serverless 应用)里直接使用数据库,而不需要自己维护实例、连接池。
特点
1. SQLite 兼容
- SQL 语法与 SQLite 基本一致;
- 可以直接用常见的 CRUD、JOIN、事务;
2. 无连接池问题
- 在传统 Serverless 里,Postgres/MySQL 常会遇到连接数爆炸;
- D1 用 HTTP API + Cloudflare 的存储层 → 天然适合 Serverless;
3.边缘托管
- 和 Workers 绑定 → 请求到最近的数据中心直接运行查询;
- 响应速度比集中式数据库更快,尤其适合全球应用;
4. 迁移 & 管理方便
- 配合 wrangler d1 可以创建数据库、执行 SQL、迁移表结构;
- 和 Drizzle ORM、Prisma 之类 ORM 可以无缝集成;
D1
绑定已有 D1 到 Worker
先拿到 D1 的 database_id:
wrangler d1 list
# 记下待绑定数据库 的 id(UUID)
编辑 wrangler.toml(补全/新增以下字段;把 your-id 替换为上一步拿到的 UUID;兼容日期用今天或任意近日期):
name = "worker01"
main = "src/index.ts"
compatibility_date = "2025-09-10" # 用今天也行
# 把 drizzle 生成的迁移文件目录告诉 wrangler
[[d1_databases]]
binding = "DB" # 代码里用 env.DB 访问
database_name = "test01"
database_id = "<your-id>"
migrations_dir = "drizzle" # 和下面要生成的目录一致
配置 Drizzle
import { defineConfig } from "drizzle-kit";
export default defineConfig({
schema: "./src/d1-test01/schema.ts", // 我们下一步会创建
out: "./drizzle", // 迁移 SQL 会生成到这里
dialect: "sqlite", // D1 基于 SQLite
});
定义数据表
在 src/ 下新建 schema.ts:
import { sqliteTable, integer, text } from "drizzle-orm/sqlite-core";
export const users = sqliteTable("users", {
id: integer("id").primaryKey({ autoIncrement: true }),
name: text("name").notNull(),
email: text("email").notNull().unique(),
});
生成迁移 SQL
pnpm drizzle-kit generate
成功后会在 drizzle/ 目录看到类似 0000_initial.sql 的迁移文件。
把迁移应用到 D1
因为刚才在 wrangler.toml 里配置了 migrations_dir = "drizzle",可以直接用 D1 的迁移指令:
wrangler d1 migrations apply test01