Skip to content

好的,这是翻译后的文档:

在 Cloudflare Workers 上使用 Prisma

在 Cloudflare Workers 上使用 Prisma 有两种方法:使用 Prisma Accelerate 或使用 Driver Adapter。

使用 Prisma Accelerate

安装 Prisma

在你的 Hono Cloudflare Workers 上安装 Prisma。这里,我使用 neon.tech 免费套餐作为我的 PostgreSQL 数据库,但你可以使用任何适合你项目的数据库。

访问 neon.tech 并创建一个免费的 PostgreSQL 数据库。

bash
npm i prisma --save-dev
npx prisma init

设置 Prisma Accelerate

要设置 Accelerate,请访问 Prisma Accelerate 并登录或免费注册。

登录后,你将进入一个页面,你可以在该页面创建一个新的 Accelerate 项目。

Accelerate Page

点击 “New project” 按钮创建一个新项目,并命名你的项目。

Accelerate Page

然后你将进入如下页面:

Accelerate Edit Page

点击 “Enable Accelerate” 按钮,你将进入以下页面:

Enable Page

将你的 neon.tech 数据库连接字符串粘贴到 “database connection string” 字段中,选择你的区域,然后点击 “Enable Accelerate” 按钮。

你将看到类似这样的内容:

API Key

点击 “Generate API Key”,你将收到一个新的 API 密钥,类似于下面的密钥:

bash
DATABASE_URL="prisma://accelerate...."

复制此 DATABASE_URL 并将其存储在 .dev.vars.env 中,以便 prisma cli 稍后可以访问它。

在你的项目中设置 Prisma

你收到的 neon.tech URL 也可以用作替代方案,并为 Prisma 提供更多选项,因此请存储它以备后用:

bash
DATABASE_URL="你的_prisma_accelerate_url"
DIRECT_URL="你的_neon_tech_url"

现在,转到你的 schema.prisma 文件,并像这样设置 URL:

ts
generator client {
  provider = "prisma-client-js"
}

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

创建一个像这样的函数,你可以在以后的项目中使用它:

ts
import { PrismaClient } from '@prisma/client/edge'
import { withAccelerate } from '@prisma/extension-accelerate'

export const getPrisma = (database_url: string) => {
  const prisma = new PrismaClient({
    datasourceUrl: database_url,
  }).$extends(withAccelerate())
  return prisma
}

这是一个如何在你的项目中使用此函数的示例:

ts
import { Hono } from 'hono'
import { sign, verify } from 'hono/jwt'
import { getPrisma } from '../usefulFun/prismaFun'

// 创建主要的 Hono 应用
const app = new Hono<{
  Bindings: {
    DATABASE_URL: string
    JWT_SECRET: string
  }
  Variables: {
    userId: string
  }
}>()

app.post('/', async (c) => {
  // 现在你可以在任何你想用的地方使用它
  const prisma = getPrisma(c.env.DATABASE_URL)
})

使用 Prisma Driver Adapter

Prisma 可以通过 driverAdapters 与 D1 Database 一起使用。先决条件是安装 Prisma 并集成 Wrangler 以绑定到你的 Hono 项目。这是一个示例项目,因为 Hono、Prisma 和 D1 Cloudflare 的所有文档都是分开的,并且没有确切、精确的分步说明。

设置 Prisma

Prisma 和 D1 正在 Wrangler 中使用绑定来确保与适配器的连接。

bash
npm install prisma --save-dev
npx prisma init
npm install @prisma/client
npm install @prisma/adapter-d1

之后,Prisma 将为你的数据库生成 schema;在 prisma/schema.prisma 中定义一个简单的模型。不要忘记更改适配器。

prisma/schema.prisma
ts
generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["driverAdapters"] // 从默认值更改
}

datasource db {
  provider = "sqlite" // d1 是基于 sql 的数据库
  url      = env("DATABASE_URL")
}

// 创建一个简单的模型数据库
model User {
  id    String @id  @default(uuid())
  email String  @unique
  name  String?
}

D1 Database

如果你已经准备好 D1 数据库,请跳过此步骤。如果还没有,请创建一个资源,可以在这里找到。

bash
npx wrangler d1 create __DATABASE_NAME__ // 用你的数据库名称替换 __DATABASE_NAME__

确保你的数据库在 wrangler.toml 中绑定。

wrangler.toml
toml
[[d1_databases]]
binding = "DB" # 例如,在你的 Worker 的 env.DB 中可用
database_name = "__DATABASE_NAME__"
database_id = "DATABASE ID"

Prisma Migrate

此命令用于迁移 Prisma 并更改为 D1 数据库,无论是本地还是远程。

bash
npx wrangler d1 migrations create __DATABASE_NAME__ create_user_table // 将生成迁移文件夹和 sql 文件

// 用于生成 sql 语句

npx prisma migrate diff \
  --from-empty \
  --to-schema-datamodel ./prisma/schema.prisma \
  --script \
  --output migrations/0001_create_user_table.sql

将数据库模型迁移到 D1。

bash
npx wrangler d1 migrations apply __DATABASE_NAME__ --local
npx wrangler d1 migrations apply __DATABASE_NAME__ --remote
npx prisma generate

配置 Prisma Client

为了使用 Prisma 从 D1 数据库查询你的数据库,你需要添加类型:

bash
npx wrangler types

这将生成一个 worker-configuration.d.ts 文件。

Prisma Clients

为了全局使用 Prisma,创建一个文件 lib/prismaClient.ts,代码如下。

ts
import { PrismaClient } from '@prisma/client'
import { PrismaD1 } from '@prisma/adapter-d1'

const prismaClients = {
  async fetch(db: D1Database) {
    const adapter = new PrismaD1(db)
    const prisma = new PrismaClient({ adapter })
    return prisma
  },
}

export default prismaClients

将 Hono 与 wrangler 环境变量值绑定:

ts
import { Hono } from 'hono'
import prismaClients from '../lib/prismaClient'

type Bindings = {
  MY_KV: KVNamespace
  DB: D1Database
}

const app = new Hono<{ Bindings: Bindings }>() // 绑定 env 值

在 Hono 路由中使用的示例:

ts
import { Hono } from 'hono'
import prismaClients from '../lib/prismaClient'

type Bindings = {
  MY_KV: KVNamespace
  DB: D1Database
}
const app = new Hono<{ Bindings: Bindings }>()

app.get('/', async (c) => {
  const prisma = await prismaClients.fetch(c.env.DB)
  const users = await prisma.user.findMany()
  console.log('users', users)
  return c.json(users)
})

export default app

这将返回 / 路由中的所有用户,使用 Postman 或 Thunder Client 查看结果。

在 MIT 许可证下发布。