无服务器计算为应用代码解决了"没有服务器要管理"的问题,但数据库却是个尴尬的掉队者。你可以在边缘以毫秒级运行一个 Worker,然后眼睁睁看着它等待一个位于遥远单一区域的数据库。Cloudflare D1 弥合了这道鸿沟:它是一个真正的 SQL 数据库,构建在 SQLite 之上,存在于 Cloudflare 的网络上,并直接绑定到你的 Workers。你编写普通的 SQL,只为实际运行的查询付费。

本指南解释 D1 是什么、花费多少、如何从 Worker 查询它,以及何时应选择它而非 KV 或传统的 Postgres 数据库。

摘要

  • D1 是构建在 SQLite 之上的无服务器 SQL 数据库,直接绑定到 Cloudflare Workers
  • 免费额度很慷慨:每天 500 万行读取和 100,000 行写入,外加 5 GB 存储
  • 按读取和写入的行数计费,而非按运行时间:空闲数据库不产生任何费用
  • 它使用熟悉的 SQL 和预处理语句,因此几乎没有学习曲线
  • 它与平台的其余部分(Workers AI 、R2 和 KV)搭配,构建完整的应用
  • 使用我的免费桌面应用 Easy Cloudflare D1 可视化管理你的数据库

Cloudflare D1 是什么

Cloudflare D1 是一个托管的无服务器数据库:构建在 SQLite 之上的关系型 SQL 存储,SQLite 是世界上久经考验的数据库引擎之一。这里的"无服务器"意味着你永远不必预配实例、选择大小或让任何东西保持运行。你创建一个数据库,将其绑定到一个 Worker,然后运行 SQL。Cloudflare 处理存储、持久性和扩展。

因为它讲标准 SQL,对任何用过关系型数据库的人来说,D1 立刻感到熟悉。你定义表,编写 SELECTINSERTUPDATEDELETE 语句,创建索引,并使用事务。区别在于运维:没有连接池要调优,没有服务器要打补丁,也没有空闲成本。

Cloudflare D1 定价与免费额度

D1 的计费模型以最好的方式与众不同:你按查询付费,以读取和写入的行数衡量,而非按时间。空闲数据库不产生任何费用,因为没有实例在运行。根据 2026 年的 D1 官方定价

Workers 免费套餐

资源每日上限
读取行每天 500 万
写入行每天 100,000
存储5 GB

Workers 付费套餐

资源包含,之后
读取行每月前 250 亿,之后每百万 0.001 美元
写入行每月前 5,000 万,之后每百万 1.00 美元
存储5 GB,之后每 GB-月 0.75 美元

没有数据传输费或出口费用。一个有用的优化细节:索引可以通过让查询扫描更少的行,大幅减少可计费的行读取,代价是写入量的小幅增加。对于读取密集型工作负载,良好的索引能让你的延迟和账单都保持在较低水平。

从 Worker 查询 D1

你在 wrangler.toml 中绑定一个 D1 数据库,然后通过 env.DB 访问它。D1 使用预处理语句,通过将查询文本与值分离,使你的查询免受 SQL 注入。

 1export default {
 2  async fetch(request, env) {
 3    // Read with a parameterised query
 4    const { results } = await env.DB
 5      .prepare("SELECT id, title FROM posts WHERE published = ? ORDER BY created_at DESC LIMIT 10")
 6      .bind(1)
 7      .all();
 8
 9    return Response.json(results);
10  },
11};

插入数据遵循同样的模式:

1await env.DB
2  .prepare("INSERT INTO posts (title, body, published) VALUES (?, ?, ?)")
3  .bind("Hello D1", "My first edge database post", 1)
4  .run();

你也可以批量处理多条语句,在一次往返中高效地运行它们,当你有多个相关写入时,这是推荐的做法。

Cloudflare D1 对比 KV 对比 Postgres

选择正确的存储原语很重要。以下是 D1 与最常被拿来权衡的两者的对比。

需求最佳选择原因
关系型数据、查询、连接D1带有表、索引和事务的真正 SQL
简单的键值查找、配置、缓存KV针对边缘上单键的快速读取进行了优化
大型现有关系型工作负载、复杂扩展Postgres(例如通过 Hyperdrive)适合繁重、功能丰富工作负载的成熟引擎

简而言之:当你只需尽快按键获取一个值时,使用 KV。当你的数据是关系型的并且想用 SQL 查询时,使用 D1。当你有大型、成熟的关系型工作负载,或需要 SQLite 不提供的 Postgres 专有功能时,选用完整的 Postgres 数据库(Workers 可以连接它,由 Hyperdrive 加速)。

何时 Cloudflare D1 是正确选择

D1 在以下情况下非常合适:

  • 你的数据是关系型的,并能从 SQL 查询、连接和索引中获益
  • 你在 Workers 上构建,并希望数据库位于同一平台
  • 你的工作负载是突发的或从低到中等的,因此按查询付费胜过常驻实例
  • 你想要零运维负担:无需预配、打补丁或连接池
  • 你满足于 SQLite 的功能集,它覆盖了绝大多数应用需求

它不太适合超出其限制的超大数据集,或依赖 Postgres 专有扩展的工作负载。对于那些情况,请改为从你的 Worker 连接一个专用数据库。

一个现实的用例

一个典型的 D1 应用:一个博客或小型 SaaS 后端,其中一个 Worker 处理请求,从 D1 查询文章或用户记录,将上传的文件和图片存储在 R2 中,把热点值缓存在 KV 中,并可选地调用 Workers AI 实现摘要之类的功能。一切都运行在一个平台上、在边缘,没有服务器,账单随实际用量扩展。这与我构建的 Cloudflare Pages 用户系统 背后的架构模式相同。

可视化管理 D1

通过命令行运行迁移和检查数据是可以的,但图形客户端让日常工作更快。我的免费桌面应用 Easy Cloudflare D1 让你浏览数据库和表、运行查询,并在 Windows、macOS 和 Linux 上的简洁界面中管理你的 D1 数据,你的凭据在你自己的机器上本地加密。而如果你的技术栈将 D1 与 KV 搭配用于缓存,我的免费应用 Easy Cloudflare KV 为你的键值命名空间做同样的事。

要点总结

  • D1 是构建在 SQLite 之上的无服务器 SQL 数据库,直接绑定到 Cloudflare Workers
  • 免费额度覆盖每天 500 万次读取和 100,000 次写入,配 5 GB 存储
  • 按读取和写入的行计费,而非按小时;空闲数据库不产生任何费用
  • 它使用带有安全预处理语句的标准 SQL,因此学习曲线极小
  • 键值查找用 KV,关系型 SQL 用 D1,繁重或扩展专有的工作负载用专用 Postgres
  • D1 与 R2、KV 和 Workers AI 结合,构建完整的边缘应用

常见问题

Cloudflare D1 是什么? D1 是构建在 SQLite 之上的无服务器 SQL 数据库,运行在 Cloudflare 的网络上,并直接绑定到 Workers。你编写标准 SQL,永远不必预配或管理服务器。Cloudflare 处理存储、持久性和扩展。

Cloudflare D1 免费吗? Workers 免费套餐中有免费额度:每天 500 万行读取和 100,000 行写入,配 5 GB 存储。许多小型应用完全在这些限制内运行。Workers 付费套餐大幅提高了包含的额度。

D1 如何定价? 你按读取和写入的行付费,而非按运行时间。在付费套餐中,每月前 250 亿行读取和 5,000 万行写入包含在内,之后每百万次读取 0.001 美元、每百万次写入 1.00 美元,存储在前 5 GB 之外为每 GB-月 0.75 美元。没有出口费用。

D1 和 KV 有什么区别? KV 是针对单键快速读取优化的键值存储,非常适合缓存和配置。D1 是关系型 SQL 数据库,用于你想用连接、索引和事务查询的结构化数据。按键查找用 KV,关系型查询用 D1。

D1 能取代 Postgres 吗? 对于许多中小型应用,能,因为 SQLite 覆盖了常见的关系型需求。对于超大数据集、繁重的并发写入工作负载,或 Postgres 专有扩展,从你的 Worker 连接的专用 Postgres 数据库(由 Hyperdrive 加速)是更好的选择。

如何从 Worker 查询 D1? 在你的 wrangler 配置中绑定数据库,并通过 env.DB 访问它。使用带有绑定参数的预处理语句,例如 env.DB.prepare(“SELECT … WHERE id = ?”).bind(id).all(),这能让查询免受 SQL 注入。