部署到 Cloudflare Workers 和 Pages
本页涵盖了使用 Prisma ORM 将应用程序部署到 Cloudflare Worker 或 Cloudflare Pages 所需的一切。
部署到 Cloudflare Workers 时的一般注意事项
本节介绍了使用 Prisma ORM 部署到 Cloudflare Workers 或 Pages 时需要了解的一般事项,无论您使用哪种数据库提供商。
使用边缘兼容的驱动程序
在部署使用 Prisma ORM 的 Cloudflare Worker 时,您需要使用一个 边缘兼容的驱动程序 及其相应的 驱动程序适配器 来使用 Prisma ORM。
适用于 Cloudflare Workers 和 Pages 的边缘兼容驱动程序有:
- Neon Serverless 使用 HTTP 访问数据库
- PlanetScale Serverless 使用 HTTP 访问数据库
node-postgres
(pg
) 使用 Cloudflare 的connect()
(TCP) 访问数据库@libsql/client
用于通过 HTTP 访问 Turso 数据库- Cloudflare D1 用于访问 D1 数据库
目前正在 进行工作,未来将使 node-mysql2
驱动程序能够从 Cloudflare Workers 和 Pages 访问传统的 MySQL 数据库。
注意:Prisma Accelerate 使您能够从任何边缘函数提供商访问任何数据库。不需要边缘兼容的驱动程序。
将您的数据库连接 URL 设置为环境变量
首先,确保 DATABASE_URL
设置为 Prisma 架构中 datasource
的 url
datasource db {
provider = "postgresql" // this might also be `mysql` or another value depending on your database
url = env("DATABASE_URL")
}
开发
在开发中使用 Worker 时,您可以通过 .dev.vars
文件 在本地配置您的数据库连接。
假设您使用上面提到的 DATABASE_URL
环境变量,您可以在 .dev.vars
中将其设置为以下内容:
DATABASE_URL="your-database-connection-string"
在上面的代码段中,your-database-connection-string
是一个占位符,您需要将其替换为自己的连接字符串的值,例如:
DATABASE_URL="postgresql://admin:[email protected]:5432/mydb"
请注意,.dev.vars
文件与通常由 Prisma ORM 使用的 .env
文件不兼容。
这意味着您需要确保 Prisma ORM 在需要时能够访问环境变量,例如在运行 Prisma CLI 命令(如 prisma migrate dev
)时。
实现这一点有几种方法:
- 使用
dotenv
运行 Prisma CLI 命令,以指定 CLI 应该从哪里读取环境变量,例如:dotenv -e .dev.vars -- npx prisma migrate dev
- 在
package.json
中创建一个脚本,通过dotenv
读取.dev.vars
。然后您可以按如下方式执行prisma
命令:npm run env -- npx prisma migrate dev
。以下是一个脚本的参考:package.json"scripts": { "env": "dotenv -e .dev.vars" }
- 将
DATABASE_URL
和任何其他相关的 env 变量复制到一个名为.env
的新文件中,然后该文件可以由 Prisma ORM 使用。
注意:如果您使用需要
dotenv
的方法,则需要安装dotenv-cli
包。您可以使用以下命令在本地项目中安装该包:npm install -D dotenv-cli
。
生产
将 Worker 部署到生产环境时,您需要使用 wrangler
CLI 设置数据库连接。
npx wrangler secret put DATABASE_URL
该命令是交互式的,将在终端中要求您输入 DATABASE_URL
env 变量的值,作为下一步。
注意:此命令要求您已进行身份验证,并且会在您未登录的情况下要求您登录 Cloudflare 帐户。
免费帐户的尺寸限制
Cloudflare 对 免费计划中的 Workers 有 1 MB 的尺寸限制。如果您的应用程序捆绑包(包含 Prisma ORM)超过该尺寸,建议您升级到付费 Worker 计划或使用 Prisma Accelerate 部署您的应用程序。
如果您在使用 pg
和 @prisma/adapter-pg
包时遇到了此问题,您可以将 pg
替换为自定义的 @prisma/pg-worker
包,并使用属于它的 @prisma/adapter-pg-worker
适配器。
@prisma/pg-worker
是 pg
的优化和轻量级版本,专为在 Worker 中使用而设计。它是 pg
的直接替代品,与 Prisma ORM 完全兼容。
使用 @cloudflare/next-on-pages
将 Next.js 应用程序部署到 Cloudflare Pages
Cloudflare 提供了一个选项,可以使用 @cloudflare/next-on-pages
在 Cloudflare Pages 上运行 Next.js 应用程序,请参阅 文档 获取说明。
根据一些测试,我们发现以下内容
- 您可以使用 PlanetScale 或 Neon Serverless 驱动程序进行部署。
- 使用
pg
的传统 PostgreSQL 部署不起作用,因为pg
本身目前与@cloudflare/next-on-pages
不兼容(参见 此处)。
如果您发现任何有关此内容的更改,请随时在 Discord 上与我们联系。
使用 node
在本地运行时,设置 PRISMA_CLIENT_FORCE_WASM=1
某些框架(例如 hono)使用 node
而不是 wrangler
在本地运行 Workers。如果您正在使用此类框架或出于其他原因在本地使用 node
运行您的 Worker,则需要设置 PRISMA_CLIENT_FORCE_WASM
环境变量。
export PRISMA_CLIENT_FORCE_WASM=1
特定于数据库的注意事项和示例
本节提供有关使用 Prisma ORM 部署 Cloudflare Worker 的特定于数据库的说明。
先决条件
作为以下部分的先决条件,您需要在本地运行 Cloudflare Worker 并且已安装 Prisma CLI。
如果您还没有,可以运行以下命令
npm create cloudflare@latest prisma-cloudflare-worker-example -- --type hello-world
cd prisma-cloudflare-worker-example
npm install prisma --save-dev
npx prisma init
您还需要使用所选数据库提供商的数据库实例。有关设置该实例,请参阅提供商的相应文档。
我们将使用默认的 User
模型作为以下示例
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
PostgreSQL(传统)
如果您使用的是通过 TCP 和 pg
驱动程序访问的传统 PostgreSQL 数据库,则需要
- 使用
@prisma/adapter-pg
数据库适配器(通过driverAdapters
预览功能) - 在
wrangler.toml
中设置node_compat = true
(参见 Cloudflare 文档)
如果您遇到大小问题,并且因此无法部署您的应用程序,可以使用我们 pg
驱动程序包的更精简版本 @prisma/pg-worker
和属于它的 @prisma/adapter-pg-worker
适配器。
@prisma/pg-worker
是 pg
的优化和轻量级版本,专为在 Worker 中使用而设计。它是 pg
的直接替代品,与 Prisma ORM 完全兼容。
1. 配置 Prisma 架构和数据库连接
注意:如果您没有要部署的项目,请按照 先决条件 中的说明在其内引导一个基本的 Cloudflare Worker 和 Prisma ORM。
首先,确保数据库连接配置正确。在您的 Prisma 架构中,将 datasource
块的 url
设置为 DATABASE_URL
环境变量。您还需要启用 driverAdapters
功能标志
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
接下来,您需要将 DATABASE_URL
环境变量设置为数据库连接字符串的值。您将在 Cloudflare 使用的名为 .dev.vars
的文件中执行此操作
DATABASE_URL="postgresql://admin:[email protected]:5432/mydb"
由于 Prisma CLI 默认情况下只兼容 .env
文件,您可以使用以下脚本调整您的 package.json
,该脚本从 .dev.vars
加载环境变量。然后,您可以使用此脚本在执行 prisma
命令之前加载环境变量。
将此脚本添加到您的 package.json
中
{
// ...
"scripts": {
// ....
"env": "dotenv -e .dev.vars"
},
// ...
}
现在,您可以执行 Prisma CLI 命令,同时确保该命令可以访问 .dev.vars
中的环境变量
npm run env -- npx prisma
2. 安装依赖项
接下来,安装所需的包
npm install @prisma/adapter-pg
npm install pg
npm install @types/pg --save-dev # if you're using TypeScript
3. 在 wrangler.toml
中设置 node_compat = true
在您的 wrangler.toml
文件中,添加以下行
node_compat = true
注意:对于 Cloudflare Pages,使用
node_compat
并未得到官方支持。如果您想在 Cloudflare Pages 中使用pg
,可以找到一个解决方法 此处.
4. 迁移您的数据库架构(如果适用)
如果您在上面运行了 npx prisma init
,则需要迁移您的数据库架构以创建在 Prisma 架构中定义的 User
表(如果您已经拥有数据库中所有需要的表,则可以跳过此步骤)
npm run env -- npx prisma migrate dev --name init
5. 在您的 Worker 中使用 Prisma Client 向数据库发送查询
以下是一个示例代码段,您可以使用它来实例化 PrismaClient
并向数据库发送查询
import { PrismaClient } from '@prisma/client'
import { PrismaPg } from '@prisma/adapter-pg'
import { Pool } from 'pg'
export default {
async fetch(request, env, ctx) {
const pool = new Pool({ connectionString: env.DATABASE_URL })
const adapter = new PrismaPg(pool)
const prisma = new PrismaClient({ adapter })
const users = await prisma.user.findMany()
const result = JSON.stringify(users)
return new Response(result)
},
}
6. 在本地运行 Worker
要在本地运行 Worker,可以运行 wrangler dev
命令
npx wrangler dev
7. 设置 DATABASE_URL
环境变量并部署 Worker
要部署 Worker,首先需要通过 wrangler
CLI 设置 DATABASE_URL
环境变量。
npx wrangler secret put DATABASE_URL
该命令是交互式的,将在终端中要求您输入 DATABASE_URL
env 变量的值,作为下一步。
注意:此命令要求您已进行身份验证,并且会在您未登录的情况下要求您登录 Cloudflare 帐户。
然后,您可以继续部署 Worker
npx wrangler deploy
该命令将输出您可以访问部署的 Worker 的 URL。
PlanetScale
如果您使用的是 PlanetScale 数据库,则需要
-
使用
@prisma/adapter-planetscale
数据库适配器(通过driverAdapters
预览功能) -
手动删除冲突的
cache
字段 (了解更多)export default {
async fetch(request, env, ctx) {
const client = new Client({
url: env.DATABASE_URL,
// see https://github.com/cloudflare/workerd/issues/698
fetch(url, init) {
delete init['cache']
return fetch(url, init)
},
})
const adapter = new PrismaPlanetScale(client)
const prisma = new PrismaClient({ adapter })
// ...
},
}
1. 配置 Prisma 架构和数据库连接
注意:如果您没有要部署的项目,请按照 先决条件 中的说明在其内引导一个基本的 Cloudflare Worker 和 Prisma ORM。
首先,确保数据库连接配置正确。在您的 Prisma 架构中,将 datasource
块的 url
设置为 DATABASE_URL
环境变量。您还需要启用 driverAdapters
功能标志
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
relationMode = "prisma" // required for PlanetScale (as by default foreign keys are disabled)
}
接下来,您需要将 DATABASE_URL
环境变量设置为数据库连接字符串的值。您将在 Cloudflare 使用的名为 .dev.vars
的文件中执行此操作
DATABASE_URL="mysql://32qxa2r7hfl3102wrccj:[email protected]/demo-cf-worker-ps?sslaccept=strict"
由于 Prisma CLI 默认情况下只兼容 .env
文件,您可以使用以下脚本调整您的 package.json
,该脚本从 .dev.vars
加载环境变量。然后,您可以使用此脚本在执行 prisma
命令之前加载环境变量。
将此脚本添加到您的 package.json
中
{
// ...
"scripts": {
// ....
"env": "dotenv -e .dev.vars"
},
// ...
}
现在,您可以执行 Prisma CLI 命令,同时确保该命令可以访问 .dev.vars
中的环境变量
npm run env -- npx prisma
2. 安装依赖项
接下来,安装所需的包
npm install @prisma/adapter-planetscale
npm install @planetscale/database
3. 迁移您的数据库架构(如果适用)
如果您在上面运行了 npx prisma init
,则需要迁移您的数据库架构以创建在 Prisma 架构中定义的 User
表(如果您已经拥有数据库中所有需要的表,则可以跳过此步骤)
npm run env -- npx prisma db push
4. 在您的 Worker 中使用 Prisma Client 向数据库发送查询
以下是一个示例代码段,您可以使用它来实例化 PrismaClient
并向数据库发送查询
import { PrismaClient } from '@prisma/client'
import { PrismaPlanetScale } from '@prisma/adapter-planetscale'
import { Client } from '@planetscale/database'
export default {
async fetch(request, env, ctx) {
const client = new Client({
url: env.DATABASE_URL,
// see https://github.com/cloudflare/workerd/issues/698
fetch(url, init) {
delete init['cache']
return fetch(url, init)
},
})
const adapter = new PrismaPlanetScale(client)
const prisma = new PrismaClient({ adapter })
const users = await prisma.user.findMany()
const result = JSON.stringify(users)
return new Response(result)
},
}
6. 在本地运行 Worker
要在本地运行 Worker,可以运行 wrangler dev
命令
npx wrangler dev
7. 设置 DATABASE_URL
环境变量并部署 Worker
要部署 Worker,首先需要通过 wrangler
CLI 设置 DATABASE_URL
环境变量。
npx wrangler secret put DATABASE_URL
该命令是交互式的,将在终端中要求您输入 DATABASE_URL
env 变量的值,作为下一步。
注意:此命令要求您已进行身份验证,并且会在您未登录的情况下要求您登录 Cloudflare 帐户。
然后,您可以继续部署 Worker
npx wrangler deploy
该命令将输出您可以访问部署的 Worker 的 URL。
Neon
如果您使用的是 Neon 数据库,则需要
- 使用
@prisma/adapter-neon
数据库适配器(通过driverAdapters
预览功能)。
1. 配置 Prisma 模式和数据库连接
注意:如果您没有要部署的项目,请按照 先决条件 中的说明在其内引导一个基本的 Cloudflare Worker 和 Prisma ORM。
首先,确保数据库连接配置正确。在您的 Prisma 架构中,将 datasource
块的 url
设置为 DATABASE_URL
环境变量。您还需要启用 driverAdapters
功能标志
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
接下来,您需要将 DATABASE_URL
环境变量设置为数据库连接字符串的值。您将在 Cloudflare 使用的名为 .dev.vars
的文件中执行此操作
DATABASE_URL="postgresql://janedoe:[email protected]/neondb?sslmode=require"
由于 Prisma CLI 默认情况下只兼容 .env
文件,您可以使用以下脚本调整您的 package.json
,该脚本从 .dev.vars
加载环境变量。然后,您可以使用此脚本在执行 prisma
命令之前加载环境变量。
将此脚本添加到您的 package.json
中
{
// ...
"scripts": {
// ....
"env": "dotenv -e .dev.vars"
},
// ...
}
现在,您可以执行 Prisma CLI 命令,同时确保该命令可以访问 .dev.vars
中的环境变量
npm run env -- npx prisma
2. 安装依赖项
接下来,安装所需的包
npm install @prisma/adapter-neon
npm install @neondatabase/serverless
3. 迁移您的数据库模式(如果适用)
如果您在上面运行了 npx prisma init
,则需要迁移您的数据库架构以创建在 Prisma 架构中定义的 User
表(如果您已经拥有数据库中所有需要的表,则可以跳过此步骤)
npm run env -- npx prisma migrate dev --name init
5. 在您的 Worker 中使用 Prisma Client 向数据库发送查询
以下是一个示例代码段,您可以使用它来实例化 PrismaClient
并向数据库发送查询
import { PrismaClient } from '@prisma/client'
import { PrismaNeon } from '@prisma/adapter-neon'
import { Pool } from '@neondatabase/serverless'
export default {
async fetch(request, env, ctx) {
const neon = new Pool({ connectionString: env.DATABASE_URL })
const adapter = new PrismaNeon(neon)
const prisma = new PrismaClient({ adapter })
const users = await prisma.user.findMany()
const result = JSON.stringify(users)
return new Response(result)
},
}
6. 在本地运行 Worker
要在本地运行 Worker,可以运行 wrangler dev
命令
npx wrangler dev
7. 设置DATABASE_URL
环境变量并部署 Worker
要部署 Worker,首先需要通过 wrangler
CLI 设置 DATABASE_URL
环境变量。
npx wrangler secret put DATABASE_URL
该命令是交互式的,将在终端中要求您输入 DATABASE_URL
env 变量的值,作为下一步。
注意:此命令要求您已进行身份验证,并且会在您未登录的情况下要求您登录 Cloudflare 帐户。
然后,您可以继续部署 Worker
npx wrangler deploy
该命令将输出您可以访问部署的 Worker 的 URL。
Cloudflare D1
如果您使用的是 D1 数据库,则需要
- 使用
@prisma/adapter-d1
数据库适配器(通过driverAdapters
预览功能) - 在 Prisma 模式中将
sqlite
设置为datasource
提供者 - 使用
prisma migrate diff
手动生成模式更改的 SQL 语句,但使用 D1 的迁移系统 执行它们。
您可以在 GitHub 上找到一个可部署的示例 。
1. 配置 Prisma 模式
注意:如果您没有要部署的项目,请按照 先决条件 中的说明在其内引导一个基本的 Cloudflare Worker 和 Prisma ORM。
在 Prisma 模式中,将driverAdapters
预览功能添加到generator
块,并将datasource
的provider
设置为sqlite
。如果您只是用prisma init
引导了 Prisma 模式,请确保还将以下User
模型添加到其中。
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
}
请注意,在本教程中,您不需要.env
文件,因为 Prisma ORM 与 D1 之间的连接将通过 绑定 进行。
2. 安装依赖项
接下来,安装所需的包
npm install @prisma/adapter-d1
此外,请确保使用 Wrangler CLI 的版本高于 wrangler@^3.39.0
,否则下一部分中使用的--remote
标志将不可用。
3. 通过绑定设置 D1 数据库连接
要将您的 Workers 与 D1 实例连接,请将以下绑定添加到您的wrangler.toml
(如果您还没有 D1 实例,您可以使用 Cloudflare Dashboard 或使用 wrangler d1 create
命令创建)。
name = "prisma-cloudflare-worker-example"
main = "src/index.ts"
compatibility_date = "2024-03-20"
compatibility_flags = ["nodejs_compat"]
[[d1_databases]]
binding = "DB" # i.e. available in your Worker on env.DB
database_name = "__YOUR_D1_DATABASE_NAME__" # to be replaced
database_id = "__YOUR_D1_DATABASE_ID__" # to be replaced
请注意,上述代码片段中的__YOUR_D1_DATABASE_NAME__
和__YOUR_D1_DATABASE_ID__
是占位符,应该替换为您自己的 D1 实例的数据库名称和 ID。
如果您无法从终端输出中获取此 ID,您也可以在 Cloudflare Dashboard 中找到它,或者在终端中运行npx wrangler d1 list
和npx wrangler d1 info __YOUR_D1_DATABASE_NAME__
。
4. 迁移您的数据库模式(如果适用)
如果您的 Prisma 模式只包含User
模型,但您的 D1 数据库仍然为空,则需要确保 D1 中有一个表,该表反映了User
模型的结构。
D1 自带自己的 迁移系统 ,它允许您管理文件系统中的迁移文件。虽然这对于创建和应用迁移文件很方便,但它不能帮助您识别需要放入这些迁移文件中的实际 SQL 语句。这就是 Prisma Migrate 发挥作用的地方,因为您可以使用 prisma migrate diff
命令生成模式更改的 SQL 语句。
首先,使用 wrangler d1 migrations
命令创建migrations
目录和初始迁移文件,如下所示
npx wrangler d1 migrations create __YOUR_D1_DATABASE_NAME__ create_user_table
再次将__YOUR_D1_DATABASE_NAME__
替换为您的数据库名称,并在出现提示时确认您要创建migrations
目录。运行完此命令后,应该会出现一个名为migrations
的新文件夹,其中包含一个名为0001_create_user_table.sql
的文件。
现在,您可以生成创建User
表的必要 SQL 语句,该表可以映射到 Prisma 模式中的User
模型,如下所示
npx prisma migrate diff --from-empty --to-schema-datamodel ./prisma/schema.prisma --script --output migrations/0001_create_user_table.sql
请注意,生成的 SQL 语句存储在migrations
目录中的一个名为0001_create_user_table.sql
的文件中,该文件如下所示
-- CreateTable
CREATE TABLE "User" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"email" TEXT NOT NULL,
"name" TEXT
);
-- CreateIndex
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
现在,您需要使用 wrangler d1 migrations apply
命令将此 SQL 语句发送到 D1。请注意,此命令接受两个选项
--local
:对 D1 的本地版本执行语句。此 D1 的本地版本是一个 SQLite 数据库文件,它将位于您的项目中。当您想在本地机器上开发和测试您的 Worker 时,此方法很有用。在 Cloudflare 文档 中了解更多信息。--remote
:对 D1 的远程版本执行语句。此版本由您部署的 Cloudflare Workers 使用。在 Cloudflare 文档 中了解更多信息。
在本教程中,您将同时进行这两项操作:在本地测试 Worker 并随后进行部署。因此,您需要运行这两个命令。打开终端并粘贴以下命令
# For the local database
npx wrangler d1 migrations apply __YOUR_D1_DATABASE_NAME__ --local
# For the remote database
npx wrangler d1 migrations apply __YOUR_D1_DATABASE_NAME__ --remote
与之前一样,您需要将__YOUR_D1_DATABASE_NAME__
替换为您的 D1 数据库的名称。
我们还来创建一些虚拟数据,以便在 Worker 运行后进行查询。这次,您将运行 SQL 语句,但不将其存储在文件中
# For the local database
npx wrangler d1 execute __YOUR_D1_DATABASE_NAME__ --command "INSERT INTO \"User\" (\"email\", \"name\") VALUES
('[email protected]', 'Jane Doe (Local)');" --local
# For the remote database
npx wrangler d1 execute __YOUR_D1_DATABASE_NAME__ --command "INSERT INTO \"User\" (\"email\", \"name\") VALUES
('[email protected]', 'Jane Doe (Remote)');" --remote
5. 在您的 Worker 中使用 Prisma Client 向数据库发送查询
在将 Prisma Client 查询添加到您的 Worker 之前,您需要使用以下命令生成 Prisma Client
npx prisma generate
为了使用 Prisma ORM 从 Worker 查询您的数据库,您需要
- 将
DB
绑定添加到Env
接口。(或者,您可以运行npx wrangler types
从一个名为worker-configuration.d.ts
的单独文件中生成Env
类型。) - 使用
PrismaD1
驱动适配器实例化PrismaClient
。 - 使用 Prisma Client 发送查询并返回结果。
打开src/index.ts
并将整个内容替换为以下内容
import { PrismaClient } from '@prisma/client'
import { PrismaD1 } from '@prisma/adapter-d1'
export interface Env {
DB: D1Database
}
export default {
async fetch(
request: Request,
env: Env,
ctx: ExecutionContext
): Promise<Response> {
const adapter = new PrismaD1(env.DB)
const prisma = new PrismaClient({ adapter })
const users = await prisma.user.findMany()
const result = JSON.stringify(users)
return new Response(result)
},
}
6. 在本地运行 Worker
数据库查询就绪,Prisma Client 也已生成,您就可以继续在本地运行 Worker 了
npm run dev
现在,您可以打开浏览器访问 https://127.0.0.1:8787
查看数据库查询结果。
;[{ id: 1, email: '[email protected]', name: 'Jane Doe (Local)' }]
7. 设置DATABASE_URL
环境变量并部署 Worker
要部署 Worker,请运行以下命令。
npm run deploy
您已部署的 Worker 可通过 https://prisma-d1-example.USERNAME.workers.dev
访问。如果您在浏览器中导航到该 URL,您应该会看到从远程 D1 数据库查询到的以下数据。
;[{ id: 1, email: '[email protected]', name: 'Jane Doe (Remote)' }]