You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Prisma中配置读写分离双数据库并在UseCase中调用?

在Prisma中实现读写分离数据库配置与调用

1. 修改Prisma Schema配置

在schema.prisma中定义两个数据源(写库和只读库),并生成两个独立的Prisma客户端:

// 写数据库数据源
datasource writeDb {
  provider = "postgresql" // 替换为你的数据库类型,如mysql
  url      = env("DATABASE_WRITE_URL")
}

// 只读数据库数据源
datasource readDb {
  provider = "postgresql"
  url      = env("DATABASE_READ_URL")
}

// 生成写操作客户端
generator writeClient {
  provider = "prisma-client-js"
  output   = "./client/write" // 指定独立输出路径
}

// 生成读操作客户端
generator readClient {
  provider = "prisma-client-js"
  output   = "./client/read"
}

// 共享模型(若读写库结构一致,模型只需定义一次)
model User {
  id    Int     @id @default(autoincrement())
  name  String
  email String  @unique
}

2. 配置环境变量

在.env文件中添加两个数据库的连接地址:

DATABASE_WRITE_URL="postgresql://user:password@write-db-host:5432/db-name"
DATABASE_READ_URL="postgresql://user:password@read-db-host:5432/db-name"

3. 生成双客户端

执行Prisma生成命令,生成两个独立的客户端文件:

prisma generate

4. 在项目中初始化客户端实例

创建工具文件(如prisma-clients.ts),分别导入并初始化两个客户端:

// 导入写客户端
import { PrismaClient as WritePrismaClient } from '../prisma/client/write'
// 导入读客户端
import { PrismaClient as ReadPrismaClient } from '../prisma/client/read'

// 初始化写客户端
export const writeDb = new WritePrismaClient({
  log: ['query'], // 可选:开启日志便于调试
})

// 初始化读客户端
export const readDb = new ReadPrismaClient({
  log: ['query'],
})

5. 在UseCase中调用对应客户端

根据操作类型选择对应的客户端:

// 写入操作示例(创建用户)
export async function createUserUseCase(name: string, email: string) {
  return await writeDb.user.create({
    data: { name, email }
  })
}

// 只读操作示例(查询用户)
export async function getUserUseCase(userId: number) {
  return await readDb.user.findUnique({
    where: { id: userId }
  })
}

注意事项

  • 确保只读数据库的账号仅拥有读权限,避免误操作
  • 事务仅支持在写数据库客户端上使用,只读客户端不支持事务
  • 若读写库结构不一致,需分别为两个数据源定义对应模型(可通过@@map映射不同表名)

内容的提问来源于stack exchange,提问作者Bárbara Araújo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 02:56:14