如何在一个schema.prisma文件中导入另一个schema.prisma文件?
跨Prisma Schema文件引用模型的实现方式
首先明确核心限制:Prisma不支持在配置了不同数据源(即连接不同数据库实例)的独立Schema文件之间,建立数据库级别的外键关联,外键是数据库层面的约束规则,仅能在同一个数据库实例内生效。
根据你的实际使用场景,可选择对应方案:
方案1:同库场景拆分多Schema文件管理
如果你的Employee和Costs模型实际归属于同一个数据库,只是想拆分文件方便维护,不需要连接两个独立数据库,可直接使用Prisma的多文件Schema能力:
- 保留1个入口
schema.prisma文件,统一存放generator和datasource配置 - 在同级目录新建专门存放模型的文件夹,将不同业务模型拆分到独立的
.prisma文件中 - 执行
prisma generate时,Prisma会自动合并目录下所有Schema文件的模型定义,你可以像在单文件中一样正常使用@relation定义关联,示例:
// schemas/employee.prisma model Employee { id Int @id @default(autoincrement()) cost_center_id Int // 直接引用同项目下其他prisma文件定义的Costs模型 cost_center Costs @relation(fields: [cost_center_id], references: [cod_center_cost]) // 其余字段省略 }
这种方式生成的Prisma Client是统一的,可正常使用include、select等原生联表查询能力。
方案2:跨独立数据库场景做应用层关联
如果你确实需要连接两个独立的PostgreSQL数据库(即你当前配置了两个不同DATABASE_URL的场景),无法在数据库层面建外键,只能在业务代码层实现手动关联:
- 保留两个独立的Schema配置,你当前已经为两个Client配置了不同的输出路径,分别执行生成命令即可得到两个独立的客户端:
prisma generate --schema=./path/to/own-db-schema.prisma prisma generate --schema=./path/to/another-db-schema.prisma - 不要在Schema模型中写跨库的
@relation注解,Prisma校验阶段会直接报错 - 在业务代码中通过多次查询手动拼接关联数据,示例:
// 分别引入两个库生成的独立客户端 import { PrismaClient as OwnDbClient } from './generated/own_database'; import { PrismaClient as AnotherDbClient } from './generated/another_database'; const ownDb = new OwnDbClient(); const anotherDb = new AnotherDbClient(); async function getEmployeeWithCost(employeeId: number) { // 先查员工数据 const employee = await ownDb.employee.findUnique({ where: { id: employeeId } }); if (!employee) return null; // 拿员工表存储的成本中心ID,去另一个库查询对应成本中心数据 const costInfo = await anotherDb.costs.findUnique({ where: { cod_center_cost: employee.cost_center_id } }); // 手动拼接关联结果返回 return { ...employee, cost_center: costInfo }; }
注意:这种应用层关联无法使用Prisma原生联表查询、级联更新/删除等数据库层能力,所有关联逻辑需要自行实现,批量查询时需要注意做数据预加载避免N+1性能问题。
特殊场景说明
如果两个模型所属的库是同一个PostgreSQL实例下的不同逻辑Schema(同一个连接地址下的不同namespace),不需要拆分两个独立的datasource配置,只需要在datasource中配置schemas参数指定要访问的PG逻辑Schema,即可在同一个Prisma项目中跨PG逻辑Schema建立模型关联。
内容的提问来源于stack exchange,提问作者Ari
相关产品推荐
相关产品推荐

