跳至内容

在 Cloudflare Workers 上使用 Prisma

有两种方法可以在 Cloudflare Workers 上使用 Prisma:使用 Prisma Accelerate 或使用驱动程序适配器。

使用 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

通过单击“新建项目”按钮创建一个新项目,并命名您的项目。

Accelerate Page

然后您将被带到如下所示的页面

Accelerate Edit Page

单击“启用 Accelerate”按钮,您将被带到以下页面

Enable Page

将您的 neon.tech 数据库连接字符串粘贴到“数据库连接字符串”字段中,选择您的区域,然后单击“启用 Accelerate”按钮。

您将看到类似以下内容

API Key

单击“生成 API 密钥”,您将收到一个类似于以下内容的新 API 密钥

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

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

在您的项目中设置 Prisma

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

bash
DATABASE_URL="your_prisma_accelerate_url"
DIRECT_URL="your_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'

// Create the main Hono app
const app = new Hono<{
  Bindings: {
    DATABASE_URL: string
    JWT_SECRET: string
  }
  Variables: {
    userId: string
  }
}>()

app.post('/', async (c) => {
  // Now you can use it wherever you want
  const prisma = getPrisma(c.env.DATABASE_URL)
})

使用 Prisma 驱动程序适配器

Prisma 可以通过 driverAdapters 与 D1 数据库一起使用。先决条件是安装 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 将为您的数据库生成模式;在 prisma/schema.prisma 中定义一个简单的模型。不要忘记更改适配器。

prisma/schema.prisma
ts
generator client {
  provider        = "prisma-client-js"
  previewFeatures = ["driverAdapters"] // change from default
}

datasource db {
  provider = "sqlite" // d1 is sql base database
  url      = env("DATABASE_URL")
}

// Create a simple model database
model User {
  id    String @id  @default(uuid())
  email String  @unique
  name  String?
}

D1 数据库

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

bash
npx wrangler d1 create __DATABASE_NAME__ // change it with yours

确保您的 DB 在 wrangler.toml 中绑定。

wrangler.toml
toml
[[d1_databases]]
binding = "DB" # i.e. available in your Worker on 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 # will generate migration folder and sql file

// for generate sql statement

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 客户端

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

bash
npx wrangler types

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

Prisma 客户端

要全局使用 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 }>() // binding env value

在 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 或 Client Thunder 查看结果。

根据 MIT 许可证发布。