跳至主要内容

部署到 Cloudflare Workers 和 Pages

本页涵盖了使用 Prisma ORM 将应用程序部署到 Cloudflare WorkerCloudflare Pages 所需的一切。

部署到 Cloudflare Workers 时的一般注意事项

本节介绍了使用 Prisma ORM 部署到 Cloudflare Workers 或 Pages 时需要了解的一般事项,无论您使用哪种数据库提供商。

使用边缘兼容的驱动程序

在部署使用 Prisma ORM 的 Cloudflare Worker 时,您需要使用一个 边缘兼容的驱动程序 及其相应的 驱动程序适配器 来使用 Prisma ORM。

适用于 Cloudflare Workers 和 Pages 的边缘兼容驱动程序有:

目前正在 进行工作,未来将使 node-mysql2 驱动程序能够从 Cloudflare Workers 和 Pages 访问传统的 MySQL 数据库。

注意Prisma Accelerate 使您能够从任何边缘函数提供商访问任何数据库。不需要边缘兼容的驱动程序。

将您的数据库连接 URL 设置为环境变量

首先,确保 DATABASE_URL 设置为 Prisma 架构中 datasourceurl

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 中将其设置为以下内容:

.dev.vars
DATABASE_URL="your-database-connection-string"

在上面的代码段中,your-database-connection-string 是一个占位符,您需要将其替换为自己的连接字符串的值,例如:

.dev.vars
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-workerpg 的优化和轻量级版本,专为在 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-workerpg 的优化和轻量级版本,专为在 Worker 中使用而设计。它是 pg 的直接替代品,与 Prisma ORM 完全兼容。

1. 配置 Prisma 架构和数据库连接

注意:如果您没有要部署的项目,请按照 先决条件 中的说明在其内引导一个基本的 Cloudflare Worker 和 Prisma ORM。

首先,确保数据库连接配置正确。在您的 Prisma 架构中,将 datasource 块的 url 设置为 DATABASE_URL 环境变量。您还需要启用 driverAdapters 功能标志

schema.prisma
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

接下来,您需要将 DATABASE_URL 环境变量设置为数据库连接字符串的值。您将在 Cloudflare 使用的名为 .dev.vars 的文件中执行此操作

.dev.vars
DATABASE_URL="postgresql://admin:[email protected]:5432/mydb"

由于 Prisma CLI 默认情况下只兼容 .env 文件,您可以使用以下脚本调整您的 package.json,该脚本从 .dev.vars 加载环境变量。然后,您可以使用此脚本在执行 prisma 命令之前加载环境变量。

将此脚本添加到您的 package.json

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 文件中,添加以下行

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 功能标志

schema.prisma
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 的文件中执行此操作

.dev.vars
DATABASE_URL="mysql://32qxa2r7hfl3102wrccj:[email protected]/demo-cf-worker-ps?sslaccept=strict"

由于 Prisma CLI 默认情况下只兼容 .env 文件,您可以使用以下脚本调整您的 package.json,该脚本从 .dev.vars 加载环境变量。然后,您可以使用此脚本在执行 prisma 命令之前加载环境变量。

将此脚本添加到您的 package.json

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 功能标志

schema.prisma
generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

接下来,您需要将 DATABASE_URL 环境变量设置为数据库连接字符串的值。您将在 Cloudflare 使用的名为 .dev.vars 的文件中执行此操作

.dev.vars
DATABASE_URL="postgresql://janedoe:[email protected]/neondb?sslmode=require"

由于 Prisma CLI 默认情况下只兼容 .env 文件,您可以使用以下脚本调整您的 package.json,该脚本从 .dev.vars 加载环境变量。然后,您可以使用此脚本在执行 prisma 命令之前加载环境变量。

将此脚本添加到您的 package.json

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 块,并将datasourceprovider 设置为sqlite。如果您只是用prisma init 引导了 Prisma 模式,请确保还将以下User 模型添加到其中。

schema.prisma
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 命令创建)。

wrangler.toml
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 listnpx 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 的文件中,该文件如下所示

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 查询您的数据库,您需要

  1. DB 绑定添加到Env 接口。(或者,您可以运行 npx wrangler types 从一个名为worker-configuration.d.ts 的单独文件中生成Env 类型。)
  2. 使用PrismaD1 驱动适配器实例化PrismaClient
  3. 使用 Prisma Client 发送查询并返回结果。

打开src/index.ts 并将整个内容替换为以下内容

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)' }]