如何在运行时获取Prisma中任意表的主键名称?
在Prisma中运行时获取表的主键名称
你可以通过Prisma Client暴露的内部_baseDmmf对象识别主键——每个模型字段的isId属性会标记该字段是否为主键(包括复合主键)。以下是具体实现方法:
实现代码
function getPrimaryKey(prisma, targetTable) { // 匹配目标表对应的模型:兼容@@map指定表名的情况 const targetModel = prisma._baseDmmf.datamodel.models.find( model => model.db.name === targetTable || model.name === targetTable ); if (!targetModel) { throw new Error(`未找到对应表 ${targetTable} 的模型定义`); } // 筛选出所有主键字段 const primaryKeyFields = targetModel.fields.filter(field => field.isId); if (primaryKeyFields.length === 0) { throw new Error(`模型 ${targetModel.name} 未定义主键`); } // 单主键返回字段名,复合主键返回字段名数组 return primaryKeyFields.length === 1 ? primaryKeyFields[0].name : primaryKeyFields.map(field => field.name); }
使用说明
- 表与模型匹配:如果你的Prisma Schema中用
@@map("table_name")为模型指定了数据库表名,函数会通过model.db.name匹配;如果没有自定义表名,直接用模型名(如User)作为targetTable参数即可。 - 复合主键支持:如果模型定义了复合主键(如
@@id([userId, postId])),函数会返回包含所有主键字段名的数组。 - 版本兼容性:
_baseDmmf是Prisma的内部API,未被官方正式文档收录,目前主流Prisma版本均支持,但后续版本可能存在变动风险。
内容的提问来源于stack exchange,提问作者Brian Mac
相关产品推荐
相关产品推荐

