Cloudflare 自 2017 年推出 Workers 以来,一直在边缘计算领域处于领先地位。随着 D1 的发布,Cloudflare 最近推出了原生无服务器数据库。我们很高兴地宣布,您现在可以使用 Prisma ORM 与 D1 进行交互!

将您的数据库带到边缘:使用 D1
边缘函数,例如 Cloudflare Workers,是一种轻量级的无服务器计算形式,分布在全球各地。它们允许您将应用程序部署和运行到尽可能靠近最终用户的位置。
D1 是 Cloudflare 针对边缘环境的原生无服务器数据库。它基于 SQLite,可在使用 Cloudflare 部署应用程序时使用。D1 于 2022 年首次推出。
您无需指定 Cloudflare Worker 或 D1 数据库的运行位置——它们只需在需要的地方运行。

遵循 Cloudflare 的地理分布式原则,并将计算和数据更接近应用程序用户,D1 支持自动读复制:它根据数据库接收到的查询数量和来源,动态管理数据库实例和只读副本的位置。
这意味着读查询将针对离查询发起位置最近的 D1 实例执行。
虽然您也可以与其他数据库提供商使用 Prisma ORM 的读副本,但这通常需要您使用 读副本客户端扩展。使用 D1 时,无需专用客户端扩展即可开箱即用地支持读副本。
另一方面,对于写操作,查询仍会传输到单个主实例,以便将更改传播到所有读副本并确保数据一致性。
Prisma ORM 现已支持 D1 🚀 (预览版)
在 Prisma,我们相信 Cloudflare 正在引领未来应用程序的构建和部署方式。
您可以通过这篇博客文章了解我们如何将 Cloudflare 视为改善 Data DX 的合作伙伴:重塑开发者体验:Prisma & Cloudflare 引领 Data DX 之路
支持 D1 一直是 Prisma ORM 在 GitHub 上最受欢迎的功能请求之一。
作为 Cloudflare 技术的坚定支持者,我们很高兴地宣布,您现在可以在 Cloudflare Workers(和 Pages)中使用 Prisma ORM 来访问 D1 数据库。
请注意,此功能基于目前处于预览阶段的驱动适配器,因此我们也认为 D1 支持处于预览阶段。
Prisma ORM 和 D1 入门
接下来,您将找到从头开始设置和部署一个通过 Prisma ORM 访问 D1 数据库的 Cloudflare Worker 的分步说明。
截至此版本,Prisma Migrate 尚未与 D1 完全兼容。在本教程中,您将结合 D1 的迁移系统和
prisma migrate diff
命令来生成和运行迁移。
先决条件
- 您的机器上安装了 Node.js 和 npm
- 一个 Cloudflare 账户
1. 创建一个 Cloudflare Worker
首先,使用 npm create
来引导一个纯净版的 Cloudflare Worker(使用 Cloudflare 的 hello-world
模板)。在您的终端中运行以下命令
这将弹出一个 CLI 向导。在每次出现问题时,通过点击 Return 键来选择所有默认选项。
在向导结束时,您应该会在域名 https://prisma-d1-example.USERNAME.workers.dev
拥有一个已部署的 Cloudflare Worker,它在浏览器中简单地显示“Hello World”
2. 初始化 Prisma ORM
Worker 准备就绪后,我们来设置 Prisma ORM。
首先,进入项目目录并安装 Prisma CLI
接下来,安装 Prisma Client 包以及 D1 的驱动适配器
最后,使用以下命令引导 Prisma ORM 所需的文件
此命令完成了两件事
- 它创建了一个名为
prisma
的新目录,其中包含您的 Prisma schema 文件。 - 它创建了一个
.env
文件,该文件通常用于配置 Prisma CLI 将读取的环境变量。
在本教程中,您不需要 .env
文件,因为 Prisma ORM 和 D1 之间的连接将通过绑定来实现。您将在下一步中找到设置此绑定的说明。
由于您将使用目前处于预览阶段的驱动适配器功能,因此您需要通过 generator
块上的 previewFeatures
字段明确启用它。
打开您的 schema.prisma
文件,并调整 generator
块,使其如下所示
3. 创建 D1 数据库
在此步骤中,您将设置 D1 数据库。通常有两种方法:使用 Cloudflare Dashboard UI 或通过 wrangler
CLI。本教程将使用 CLI。
打开您的终端并运行以下命令
如果一切顺利,您应该会看到类似以下的输出
您现在在 Cloudflare 账户中拥有一个 D1 数据库,并已绑定到您的 Cloudflare Worker。
复制命令输出的最后一部分并将其粘贴到您的 wrangler.toml
文件中。它应该看起来像这样
请注意,上面代码片段中的 __YOUR_D1_DATABASE_ID__
是一个占位符,应替换为您自己的 D1 实例的数据库 ID。如果您无法从终端输出中获取此 ID,也可以在 Cloudflare 控制台 中找到它,或者在终端中运行 npx wrangler d1 info prisma-demo-db
。
接下来,您将在数据库中创建一个数据库表,以便能够使用 Prisma ORM 向 D1 发送一些查询。
4. 在数据库中创建表
D1 通过 wrangler d1 migrate
命令提供了自己的迁移系统。该迁移系统与 Prisma CLI 配合良好,Prisma CLI 提供了工具,允许您为模式更改生成 SQL 语句。因此,您可以
- 使用 D1 的原生迁移系统创建并将迁移文件应用到您的 D1 实例
- 使用 Prisma CLI 为任何模式更改生成 SQL 语句
接下来,您将同时使用 D1 的迁移系统和 Prisma CLI 来创建并针对您的数据库运行迁移。
首先,使用 wrangler
CLI 创建一个新的迁移
当提示命令是否可以创建一个名为 migrations
的新文件夹时,点击 Return 键确认。
该命令现在已创建一个名为 migrations
的新目录,并在其中创建了一个名为 0001_create_user_table.sql
的空文件
接下来,您需要将创建 User
表的 SQL 语句添加到该文件中。打开 schema.prisma
文件并添加以下 User
模型
现在,在您的终端中运行以下命令,生成创建与上述 User
模型等效的 User
表的 SQL 语句
这将在您之前的迁移文件 migrations/0001_ceate_user_table.sql
中存储一个创建新 User
表的 SQL 语句,它看起来像这样
您现在需要使用 wrangler d1 migrations apply
命令将此 SQL 语句发送到 D1。此命令接受两个选项
--local
:针对 D1 的本地版本执行语句。此 D1 的本地版本是一个 SQLite 数据库文件,将位于您项目的.wrangler/state
目录中。当您想在本地机器上开发和测试您的 Worker 时,此方法很有用。在Cloudflare 文档中了解更多。--remote
:针对 D1 的远程版本执行语句。此版本由您已部署的 Cloudflare Workers 使用。在Cloudflare 文档中了解更多。
在本教程中,您将两者都做:在本地测试 Worker,然后再部署它。因此,您需要运行这两个命令。打开您的终端并粘贴以下命令。
首先,针对您的本地数据库执行模式更改
接下来,针对远程数据库
两次都被提示确认是否应用迁移时,请点击 Return 键。
您的本地和远程 D1 实例现在都包含 User
表。
我们再创建一些可以在 Worker 运行后查询的虚拟数据。这次,您将运行 SQL 语句,而不将其存储在文件中。
再次,首先针对您的本地数据库运行该命令
最后,针对您的远程数据库运行它
您现在在本地和远程数据库实例中都有一个虚拟记录。您可以在 .wrangler/state
中找到本地 SQLite 文件,而远程文件可以在 Cloudflare 控制台中查看。
5. 从 Worker 查询您的数据库
为了使用 Prisma ORM 从 Worker 查询数据库,您需要
- 将
DB
添加到Env
接口。 - 使用
PrismaD1
驱动适配器实例化PrismaClient
。 - 使用 Prisma Client 发送查询并返回结果。
打开 src/index.ts
并将其内容替换为以下内容
在运行 Worker 之前,您需要使用以下命令生成 Prisma Client
6. 在本地运行 Worker
数据库查询准备就绪且 Prisma Client 已生成后,您可以继续在本地运行 Worker
现在您可以在浏览器中打开 https://:8787
查看数据库查询结果
7. 部署 Worker
要部署 Worker,请运行以下命令
与之前一样,您已部署的 Worker 可通过 https://prisma-d1-example.USERNAME.workers.dev
访问。如果您在浏览器中访问该 URL,您应该会看到从远程 D1 数据库查询到的以下数据
恭喜,您刚刚部署了一个使用 D1 作为数据库并通过 Prisma ORM 查询它的 Cloudflare Worker 🎉
立即试用
我们很想听听您对 Prisma ORM 中新 D1 支持的看法!请试用并向我们反馈您的意见,您可以在 GitHub 或 Discord 上分享。编码愉快 ✌️
不要错过下一篇文章!
订阅 Prisma 简报