如何自动将Prisma模型转换为GraphQL模型?避免重复编写
基于Prisma Schema自动生成GraphQL模型的方案
1. 用Prisma官方GraphQL生成器(首推)
Prisma有官方维护的生成器工具,能直接从你的Schema一键生成对应的GraphQL类型、输入类型甚至Resolver骨架,完全不用手动重复写。
操作步骤:
- 安装依赖:
npm install --save-dev prisma-graphql-generator - 在
prisma/schema.prisma里添加生成器配置:
generator graphql { provider = "prisma-graphql-generator" output = "./generated/graphql" // 自定义生成文件的存放路径 }
- 执行生成命令:
npx prisma generate
针对你给出的companiesOnUsers模型,生成的GraphQL类型大概长这样:
type CompaniesOnUsers { company: Company! companyId: Int! user: User! userId: Int! role: CompanyRoles! roleId: Int! createdAt: DateTime! updatedAt: DateTime! } input CompaniesOnUsersCreateInput { company: CompanyCreateNestedOneWithoutCompaniesOnUsersInput! user: UserCreateNestedOneWithoutCompaniesOnUsersInput! role: CompanyRolesCreateNestedOneWithoutCompaniesOnUsersInput! }
生成的Resolver模板也能直接复用,省掉大量重复编码工作。
2. Prisma Client + 手动定义GraphQL类型(适合需自定义场景)
如果需要对GraphQL类型做更灵活的定制,可以手动编写GraphQL类型,然后直接复用Prisma Client完成数据操作,不用重复编写数据库逻辑:
先定义GraphQL类型:
type CompaniesOnUsers { companyId: Int! userId: Int! roleId: Int! createdAt: String! updatedAt: String! company: Company! user: User! role: CompanyRoles! } type Query { getCompaniesOnUsers: [CompaniesOnUsers!]! }
然后在Resolver里调用Prisma Client:
const resolvers = { Query: { getCompaniesOnUsers: async (_, __, { prisma }) => { return prisma.companiesOnUsers.findMany({ include: { company: true, user: true, role: true } }); } } };
这种方式虽然要手动写GraphQL类型,但数据层逻辑完全依赖Prisma,不用重复造轮子。
3. 用GraphQL Code Generator工具同步
借助graphql-codegen工具和配套的Prisma插件,可以实现Prisma模型和GraphQL类型的双向同步,避免手动维护的重复劳动。
配置示例(新建codegen.yml):
schema: ./src/schema.graphql generates: ./src/generated/graphql.ts: plugins: - typescript - typescript-resolvers - typescript-prisma config: prismaClientPath: '../prisma/client'
执行生成命令:npx graphql-codegen
工具会自动完成GraphQL类型与Prisma类型的映射,保持两者同步更新。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

