部署到 Cloudflare Workers 和 Pages
本页涵盖了将带有 Prisma ORM 的应用部署到 Cloudflare Worker 或 Cloudflare Pages 所需了解的一切。
部署到 Cloudflare Workers 的一般注意事项
本节涵盖了当您部署到 Cloudflare Workers 或 Pages 并使用 Prisma ORM 时,无论您使用何种数据库提供商,都需要注意的一般事项。
使用边缘兼容的驱动程序
当部署使用 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 schema 中被设置为 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
的新文件中,Prisma ORM 可以使用该文件。
注意:如果您使用需要
dotenv
的方法,您需要安装dotenv-cli
包。例如,您可以使用此命令在您的项目中本地安装该包:npm install -D dotenv-cli
。
生产
当将您的 Worker 部署到生产环境时,您需要使用 wrangler
CLI 设置数据库连接
npx wrangler secret put DATABASE_URL
该命令是交互式的,将要求您在终端中的下一步输入 DATABASE_URL
环境变量的值。
注意:此命令要求您已通过身份验证,如果您尚未登录,则会要求您登录到您的 Cloudflare 帐户。
免费帐户的大小限制
Cloudflare 对免费计划的 Workers 有 3 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 Driver 进行部署。
- 使用
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 schema 和数据库连接
注意:如果您没有要部署的项目,请按照先决条件中的说明来引导一个基本的带有 Prisma ORM 的 Cloudflare Worker。
首先,确保数据库连接配置正确。在您的 Prisma schema 中,将 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. 迁移您的数据库 schema(如果适用)
如果您在上面运行了 npx prisma init
,则需要迁移您的数据库 schema 以创建在您的 Prisma schema 中定义的 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
环境变量的值。
注意:此命令要求您已通过身份验证,如果您尚未登录,则会要求您登录到您的 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 schema 和数据库连接
注意:如果您没有要部署的项目,请按照先决条件中的说明来引导一个基本的带有 Prisma ORM 的 Cloudflare Worker。
首先,确保数据库连接配置正确。在您的 Prisma schema 中,将 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. 迁移您的数据库 schema(如果适用)
如果您在上面运行了 npx prisma init
,则需要迁移您的数据库 schema 以创建在您的 Prisma schema 中定义的 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
环境变量的值。
注意:此命令要求您已通过身份验证,如果您尚未登录,则会要求您登录到您的 Cloudflare 帐户。
然后您可以继续部署 Worker
npx wrangler deploy
该命令将输出您可以访问已部署 Worker 的 URL。
Neon
如果您使用的是 Neon 数据库,则需要:
- 使用
@prisma/adapter-neon
数据库适配器(通过driverAdapters
预览功能)
1. 配置 Prisma schema 和数据库连接
注意:如果您没有要部署的项目,请按照先决条件中的说明来引导一个基本的带有 Prisma ORM 的 Cloudflare Worker。
首先,确保数据库连接配置正确。在您的 Prisma schema 中,将 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. 迁移您的数据库 schema(如果适用)
如果您在上面运行了 npx prisma init
,则需要迁移您的数据库 schema 以创建在您的 Prisma schema 中定义的 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
环境变量的值。
注意:此命令要求您已通过身份验证,如果您尚未登录,则会要求您登录到您的 Cloudflare 帐户。
然后您可以继续部署 Worker
npx wrangler deploy
该命令将输出您可以访问已部署 Worker 的 URL。