Skip to main content

Cloudflare D1 数据库操作

简介

Cloudflare D1Cloudflare 推出的 Serverless SQL 数据库。底层基于 SQLite,但是由 Cloudflare 托管并分布在边缘节点。设计目标是:让开发者在 Cloudflare WorkersServerless 应用)里直接使用数据库,而不需要自己维护实例、连接池。

特点

1. SQLite 兼容

  • SQL 语法与 SQLite 基本一致;
  • 可以直接用常见的 CRUDJOIN、事务;

2. 无连接池问题

  • 在传统 Serverless 里,Postgres/MySQL 常会遇到连接数爆炸;
  • D1HTTP API + Cloudflare 的存储层 → 天然适合 Serverless

3.边缘托管

  • Workers 绑定 → 请求到最近的数据中心直接运行查询;
  • 响应速度比集中式数据库更快,尤其适合全球应用;

4. 迁移 & 管理方便

  • 配合 wrangler d1 可以创建数据库、执行 SQL、迁移表结构;
  • Drizzle ORM、Prisma 之类 ORM 可以无缝集成;

D1

绑定已有 D1Worker

先拿到 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