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

如何通过表名字符串获取对应Prisma的findMany查询参数?

通过表名获取Prisma对应表的FindMany参数类型

要实现仅通过表名获取对应表的查询参数并实现类型安全的函数,可以利用Prisma自动生成的类型系统来实现,具体步骤如下:

1. 利用Prisma生成的内置类型

Prisma运行npx prisma generate后,会为每个模型生成对应的FindManyArgs类型,比如模型user对应Prisma.UserFindManyArgs。我们可以通过类型映射将表名字符串关联到这些参数类型。

首先定义核心类型映射:

import { PrismaClient, Prisma } from '@prisma/client';

// 提取所有Prisma模型的名称
type ModelName = keyof PrismaClient;
// 将表名映射到对应的FindMany参数类型
type ModelFindManyArgs<M extends ModelName> = Prisma[`${Capitalize<M>}FindManyArgs`];

2. 实现类型安全的通用函数

基于上面的类型,编写支持动态表名+对应参数类型的函数:

const prisma = new PrismaClient();

async function findManyByTableName<M extends ModelName>(
  tableName: M,
  args?: ModelFindManyArgs<M>
) {
  return await prisma[tableName].findMany(args);
}

调用示例

当传入具体表名时,TypeScript会自动推断args的类型,提供精准的代码提示和类型校验:

// 传入user表,args自动匹配UserFindManyArgs类型
findManyByTableName('user', {
  where: { name: { contains: 'Alice' } },
  select: { id: true, name: true }
});

// 传入post表,args自动匹配PostFindManyArgs类型
findManyByTableName('post', {
  where: { published: true },
  include: { author: true }
});

3. 处理动态表名场景

如果表名是动态生成的字符串(非字面量),可以通过类型守卫来做合法性校验,再手动断言参数类型:

// 校验表名是否为合法的Prisma模型名
function isModelName(value: string): value is ModelName {
  return Object.keys(prisma).includes(value);
}

async function dynamicFindMany(tableName: string, args?: Record<string, unknown>) {
  if (!isModelName(tableName)) {
    throw new Error(`无效表名:${tableName}`);
  }
  // 手动断言参数类型
  return await prisma[tableName].findMany(args as ModelFindManyArgs<typeof tableName>);
}

内容的提问来源于stack exchange,提问作者Beatriz Helena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 05:25:20