如何在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
相关产品推荐
相关产品推荐

