用途
Cloudflare D1 是运行在边缘上的无服务器 SQLite 数据库,提供无需服务器的 SQL 数据库、全球分布、零冷启动、标准 SQLite 语法以及面向全球性能的读复制能力。本技能用于帮助开发者在 Cloudflare Workers 环境中使用 D1 进行数据库开发,涵盖数据库、迁移、绑定配置,以及在遇到 D1_ERROR、statement too long、too many requests queued 等错误时的处理。
主要能力
- 数据库创建与绑定配置:通过命令创建数据库并保存 database_id,在 wrangler.jsonc 中配置 d1_databases 绑定(含 binding、database_name、database_id、preview_database_id)。
- 迁移管理:使用 migrations create 创建迁移,migrations apply 应用迁移(本地 --local 与生产 --remote),要求迁移幂等(CREATE TABLE IF NOT EXISTS、CREATE INDEX IF NOT EXISTS、DROP TABLE IF EXISTS),并在迁移末尾添加 PRAGMA optimize。
- 查询 API:prepare() 执行查询(all、first、raw)、bind() 绑定参数、batch() 执行多条查询(单事务,全部成功或全部失败)、exec() 执行 SQL 字符串(仅用于迁移或初始化,禁止用于含用户输入的查询)。
- 常见模式:用户 CRUD、批量操作、读复制、基于 batch 的事务、分页。
- 读复制:通过 withSession 配置 preferredRegion(auto 或 weur、wnam、enam、apac),从最近副本读取,可查看 served_by_region。
- 类型亲和性:INTEGER/INT 为 INTEGER,TEXT/VARCHAR/CHAR 为 TEXT,REAL/FLOAT/DOUBLE 为 REAL,BLOB 与无类型为 BLOB;建议数字用 INTEGER、字符串用 TEXT(不用 VARCHAR)、时间戳用 INTEGER(Date.now())、二进制用 BLOB。
- 错误预防:使用 .bind() 防止 SQL 注入、为 WHERE/JOIN 列建索引、本地测试迁移、时间戳使用 INTEGER、批处理限制在 500 条语句以内。
2025 年更新要点
- 2025 年 1 月:性能提升,全球 P50 查询延迟降低 40-60%,针对边缘执行优化 SQLite 引擎,降低小于 100 MB 数据库的冷启动影响。
- 2025 年 9 月:可靠性增强,读查询在瞬时故障时自动重试最多 2 次,对应用代码透明(记录于 wrangler tail)。
- 2025 年 4 月:可扩展性增强,读复制(公开测试)可全球部署只读副本,读吞吐最高提升 2 倍,Sessions API 支持读写分离。
- 2025 年 11 月:合规增强,数据本地化,可指定 EU/US 司法管辖区用于 GDPR/数据主权,通过 --jurisdiction 标志或 wrangler.jsonc 配置。
- 破坏性变更(2025 年 2 月 10 日):免费套餐强制硬性限制为 10 个数据库、每个 500 MB、每次调用 50 次查询;超出限制将返回 429 错误(此前仅为警告)。建议使用 wrangler d1 list 检查用量并按需升级。
使用方式
- 创建数据库:bunx wrangler d1 create my-database,保存输出中的 database_id。
- 配置绑定:在 wrangler.jsonc 中添加 d1_databases 配置,并设置 compatibility_date(示例为 2025-10-11)。
- 创建迁移:bunx wrangler d1 migrations create my-database create_users,编辑生成的 .sql 文件。
- 应用迁移:本地 bunx wrangler d1 migrations apply my-database --local;生产 bunx wrangler d1 migrations apply my-database --remote。
- 在 Worker 中查询:通过 env.DB.prepare(...).bind(...).all() 等方式执行查询,示例使用 Hono 框架。
适用场景
- 在 Cloudflare Workers 上构建需要 SQL 数据库的全球分布式应用。
- 用户 CRUD、批量插入、分页查询等常规数据库操作。
- 需要原子性的事务场景(通过 batch 实现转账等操作)。
- 读多写少、需要全球低延迟读取的场景(读复制)。
- 需要按司法管辖区进行数据本地化的合规场景。
限制与注意事项
- 免费套餐硬性限制:10 个数据库、每个 500 MB、每次调用 50 次查询,超出返回 429 错误。
- 单行不得超过 1 MB。
- 禁止将用户输入拼接进 SQL;禁止将 database_id 提交到公开仓库;禁止跳过迁移直接手动改结构;禁止对筛选列省略索引;禁止无 LIMIT 的 SELECT *;禁止未本地测试就运行迁移。
- 时间戳不要用 DATETIME,使用 INTEGER;字符串不要用 VARCHAR,使用 TEXT。
- 批处理语句建议限制在 500 条以内。
- exec() 仅用于迁移或初始化,禁止用于带用户输入的查询。
- 安装 D1 驱动包时的供应链安全建议:通过 npm config set ignore-scripts true 阻断安装后脚本(Bun 默认禁用);对新版本设置 7 天冷却期等待社区审核;安装前使用 socket package score 或 socket npm install 审计包。
交互工具与资源
- 代理:agents/d1-debugger.md 提供 9 阶段诊断(配置、迁移、查询、绑定、错误、限制、性能、Time Travel);agents/d1-query-optimizer.md 提供性能分析(慢查询、缺失索引、优化建议)。
- 命令:commands/cloudflare-d1:setup.md 为首次设置交互向导;commands/d1-create-migration.md 为带校验的迁移创建向导。
- 参考资料:references/setup-guide.md(完整设置)、references/query-patterns.md(完整 API 参考)、references/read-replication.md(全球读副本)、references/best-practices.md(性能与优化)、references/limits.md(限制与配额)、references/metrics-analytics.md(监控与分析)、references/2025-features.md(2025 功能与破坏性变更)。
- 模板:templates/schema-example.sql、templates/d1-worker-queries.ts、templates/cloudflare-d1:setup-migration.sh。
官方文档
- D1 概览:https://developers.cloudflare.com/d1/
- 快速开始:https://developers.cloudflare.com/d1/get-started/
- 客户端 API:https://developers.cloudflare.com/d1/build-with-d1/d1-client-api/
- 读复制:https://developers.cloudflare.com/d1/reference/read-replication/