在 Cloudflare Workers 上使用 Prisma
有两种方法可以在 Cloudflare Workers 上使用 Prisma:使用 Prisma Accelerate 或使用驱动程序适配器。
使用 Prisma Accelerate
安装 Prisma
在您的 Hono Cloudflare Workers 上安装 Prisma。这里我使用 neon.tech 免费层作为我的 PostgreSQL 数据库,但您可以使用适合您项目的任何数据库。
访问 neon.tech 并创建一个免费的 PostgreSQL 数据库。
npm i prisma --save-dev
npx prisma init
设置 Prisma Accelerate
要设置 Accelerate,请访问 Prisma Accelerate 并登录或免费注册。
登录后,您将被带到一个页面,您可以在其中创建一个新的 Accelerate 项目。
通过单击“新建项目”按钮创建一个新项目,并命名您的项目。
然后您将被带到如下所示的页面
单击“启用 Accelerate”按钮,您将被带到以下页面
将您的 neon.tech 数据库连接字符串粘贴到“数据库连接字符串”字段中,选择您的区域,然后单击“启用 Accelerate”按钮。
您将看到类似以下内容
单击“生成 API 密钥”,您将收到一个类似于以下内容的新 API 密钥
DATABASE_URL="prisma://accelerate...."
复制此 DATABASE_URL
并将其存储在 .dev.vars
和 .env
中,以便 prisma cli 稍后可以访问它。
在您的项目中设置 Prisma
您收到的 neon.tech URL 也可以用作替代方案,并为 Prisma 提供更多选项,因此请将其保存以备后用
DATABASE_URL="your_prisma_accelerate_url"
DIRECT_URL="your_neon_tech_url
现在,转到您的 schema.prisma
文件并像这样设置 URL
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_URL")
}
创建一个这样的函数,您可以在以后的项目中使用它
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
}
以下是如何在您的项目中使用此函数的示例
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 中使用绑定来确保与适配器的连接。
npm install prisma --save-dev
npx prisma init
npm install @prisma/client
npm install @prisma/adapter-d1
之后,Prisma 将为您的数据库生成模式;在 prisma/schema.prisma
中定义一个简单的模型。不要忘记更改适配器。
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 数据库,请跳过此步骤。但如果没有,请创建一个资源,可以在 此处找到。
npx wrangler d1 create __DATABASE_NAME__ // change it with yours
确保您的 DB 在 wrangler.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 数据库,无论是本地还是远程。
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。
npx wrangler d1 migrations apply __DATABASE_NAME__ --local
npx wrangler d1 migrations apply __DATABASE_NAME__ --remote
npx prisma generate
配置 Prisma 客户端
为了从 D1 数据库使用 Prisma 查询您的数据库,您需要添加类型
npx wrangler types
将生成一个 worker-configuration.d.ts
文件。
Prisma 客户端
要全局使用 Prisma,请创建一个带有以下代码的文件 lib/prismaClient.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 环境值绑定
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 路由中的使用示例
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 查看结果。