如何为Prisma创建基于表名的可复用查询函数?
能否为Prisma创建可复用的查询函数?
当然可以,你提供的这种通过表名字符串动态调用Prisma模型的方式是可行的,但实际使用中有几个细节需要优化:
- 类型安全缺失问题:直接传入字符串类型的
tableName会失去TypeScript的类型校验,比如传入不存在的表名时,编辑器不会给出提示,只有运行时才会报错。可以通过定义Prisma模型名称的联合类型来解决这个问题:
type PrismaModelName = keyof typeof prisma; async function getData(tableName: PrismaModelName) { const data = await prisma[tableName].findMany({}); return data; }
这样只有传入Prisma生成的合法模型名称时,才能通过类型检查。
连接管理不当:示例中每次调用
getData都执行prisma.$disconnect()并不推荐。Prisma Client本身会维护连接池,频繁断开重连会降低性能,通常只需要在应用关闭(shutdown)时调用一次$disconnect()即可。提升扩展性:可以给函数增加可选参数,支持传递
findMany的查询配置,让函数的复用性更强:
type PrismaModelName = keyof typeof prisma; type FindManyArgs<T> = Parameters<T['findMany']>[0]; async function getData<T extends PrismaModelName>( tableName: T, args?: FindManyArgs<typeof prisma[T]> ) { const data = await prisma[tableName].findMany(args || {}); return data; }
调用时就可以灵活传入筛选、排序等参数,比如:getData('User', { where: { age: { gt: 18 } }, orderBy: { createdAt: 'desc' } })。
内容的提问来源于stack exchange,提问作者Saqo Melqon
相关产品推荐
相关产品推荐

