ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Prisma Binding 代码生成(Codegen)实战指南:从 `prisma-binding` CLI 到自动化生成工作流

Prisma Binding 代码生成(Codegen)实战指南:从 `prisma-binding` CLI 到自动化生成工作流 Prisma Binding 代码生成Codegen实战指南从prisma-bindingCLI 到自动化生成工作流【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1prisma-binding内置的代码生成器 CLI 可以把 Prisma 服务生成的数据库 Schemaprisma.graphql一键转成类型安全的 TypeScript / JavaScript 绑定代码让你像调用本地 SDK 一样访问 Prisma GraphQL API。本文将完整讲解prisma-binding代码生成的安装、CLI 参数、GraphQL Config 集成与 v1.X 升级迁移并结合本仓库Prisma 1.x 开源实现中prisma generate命令与prisma-client-lib各语言 Generator 的源码深入说明代码生成背后的实现原理。读完本文你将能够在自己的 Prisma 项目中独立搭建并自动化“部署即生成”的绑定代码流水线。为什么需要代码生成从手写 delegate resolver 到自动生成 SDK在 Prisma 的架构中Prisma 服务会根据你的数据模型自动产出一份包含完整 CRUD API 的Prisma 数据库 Schema通常命名为prisma.graphql它定义了Query、Mutation、Subscription三个根类型。prisma-binding是针对 Prisma GraphQL API 的专用 GraphQL Binding 实现可以把它理解为 Prisma 服务的自动生成的 SDK它负责把 GraphQL 查询委托delegate给底层 Prisma 服务你不再需要在 resolver 里手写 SQL 或直接操作数据库 API大多数 resolver 只是一行委托调用详见 Prisma-Bindings 概览。而**代码生成Codegen**解决的问题是Prisma 数据库 Schema 随数据模型演进而变化手写绑定代码不现实。prisma-binding自带的生成器 CLI 可以读取prisma.graphql自动生成对应的绑定文件如binding.ts把query、mutation、exists等 API 以类型完备的方式暴露出来。安装prisma-bindingprisma-binding自带生成器 CLI需要以全局方式安装也可以作为项目依赖安装后通过npx调用。支持 npm 与 yarn 两种包管理器# 使用 npm 全局安装 npm install -g prisma-binding# 使用 yarn 全局安装 yarn global add prisma-binding安装完成后即可在任意目录下调用prisma-binding命令执行代码生成。CLI 用法与参数说明生成器的核心命令格式如下Usage: prisma-binding -i [input] -l [language] -b [outputBinding]参数别名说明类型是否必填--help-显示帮助信息boolean否--version-显示版本号boolean否--input-iprisma.graphql文件路径string是--language-l生成器语言可选typescript、javascriptstring是--outputBinding-b输出绑定文件例如binding.tsstring是一个典型的调用示例prisma-binding \ --input src/generated/prisma.graphql \ --language typescript \ --outputBinding src/generated/binding.ts需要说明的是这里--language支持typescript与javascript两种绑定代码语言。在 Prisma 生态更完整的实现中代码生成还覆盖了更多目标语言与产物在本仓库的prisma generate命令generate.ts中实际支持的 generator 包括graphql-schema、typescript-client、javascript-client、go-client、flow-client五种分别对应prisma-client-lib中导出的TypescriptGenerator、JavascriptGenerator、GoGenerator、FlowGenerator等实现见 prisma-client-lib 导出入口。因此如果你使用的是prisma generate或 GraphQL Config 生态可以按需扩展到 Go 与 Flow 等更多语言。与 GraphQL Config 集成把参数写进配置文件prisma-bindingCLI 与GraphQL Config深度集成与其在命令行中逐个传参不如在项目根目录写一个.graphqlconfig.ymlCLI 会自动读取其中的配置。例如下面的.graphqlconfig.yml定义了一个名为myapp的 projectschemaPath指向 Prisma 数据库 Schema并通过extensions.codegen声明使用prisma-binding生成器projects: myapp: schemaPath: src/generated/prisma.graphql extensions: prisma: prisma/prisma.yml codegen: - generator: prisma-binding language: typescript output: binding: src/generated/prisma.ts此时只要在包含上述.graphqlconfig.yml的目录下执行graphql codegen命令其效果等价于执行prisma-binding \ --language typescript \ --outputBinding src/generated/prisma.ts这里schemaPath指向的src/generated/prisma.graphql充当了 CLI 的--input因此命令中不再需要显式传-i。这种“配置驱动”的方式让代码生成参数与项目一起版本化可复现、可审查。在实际的 Prisma 项目里src/generated/prisma.graphql通常由 GraphQL CLI 的graphql get-schema从 Prisma 端点下载而来。完整的接入流程可参考教程 Access Prisma from a Node script using Prisma Bindings先用graphql get-schema下载数据库 Schema再基于它实例化Prisma绑定即可执行createUser、query.users、updatePost等 CRUD 调用。源码视角生成器是如何把 Schema 变成代码的为了更好地理解生成产物可以到本仓库的prisma-client-lib中查看生成器的具体实现。以 TypeScript 为例TypescriptGeneratortypescript-client.ts在构造时接收schemaGraphQLSchema与internalTypes两个输入schema通过buildSchema(schemaString)从prisma.graphql解析出的 GraphQL SchemainternalTypes由parseInternalTypes从数据模型解析出的内部类型列表。生成器内部维护了一张scalarMapping表把 GraphQL 标量映射为 TypeScript 类型typescript-client.tsGraphQL 标量TypeScript 类型IntnumberStringstringIDstring \| numberFloatnumberBooleanbooleanDateTimeInputDate \| stringDateTimeOutputstringJsonany对每个 GraphQL Object 类型生成器会输出多个变体接口/对象、输入/输出形式等并通过render()拼装最终代码renderTypedefs()输出prisma-schema.ts见 generate.ts。也就是说生成的绑定文件不仅包含委托函数还包含与数据模型对应的全部类型定义。另一个值得注意的实现细节是环境变量插值Generator基类提供静态方法replaceEnvGenerator.ts会把prisma.yml中形如${env:VAR_NAME}的占位符递归替换为process.env[VAR_NAME]。prisma generate在生成 TypeScript 客户端时会用这个方法处理endpoint与secretgenerate.ts这意味着生成的绑定代码可以在运行时从环境变量读取服务端点与密钥避免把密钥硬编码进产物。从prisma-bindingv1.X 升级graphql prepare→graphql codegenprisma-binding2.0 之前的版本基于graphql prepare命令进行生成2.0 起统一改用了graphql codegen。如果你正在使用旧版本需要按下述方式更新 Prisma 项目文件。prisma.yml把post-deploy钩子中的graphql prepare替换为graphql codegen通常还会配合graphql get-schema先拉取最新 Schema# ... other properties hooks: post-deploy: - graphql get-schema - graphql codegen.graphqlconfig.ymlprepare-binding扩展改名为codegen并把generator值改为prisma-binding同时通过output.binding声明输出文件projects: myapp: schemaPath: src/generated/prisma.graphql extensions: prisma: prisma/prisma.yml codegen: - generator: prisma-binding language: typescript output: binding: src/generated/prisma.ts作为对照旧版基于graphql prepare的.graphqlconfig.yml形如extensions.prepare-bindinggenerator: prisma-ts升级时需按上述新格式改写可参考 prisma.yml YAML 结构文档 中保留的旧式配置示例。把代码生成接入部署工作流post-deploy钩子生产可用的做法是把代码生成挂到 Prisma 的部署钩子上让绑定代码随数据模型变更自动更新。在prisma.yml中配置hooks.post-deploy每次prisma deploy成功后依次执行下载 Schema 与生成代码endpoint: http://localhost:4466/myservice/dev secret: mysecret123 hooks: post-deploy: - graphql get-schema --project db - graphql codegen该配置的完整上下文可参考 prisma.yml 概览与示例其中graphql get-schema从端点下载最新 Prisma 数据库 Schemagraphql codegen依据.graphqlconfig.yml中的codegen扩展执行绑定生成。这样团队成员每次deploy后拿到的都是与最新数据模型一致的绑定代码从源头避免“Schema 已变、绑定未更新”的错位问题。生成之后使用绑定的最小示例代码生成完成后生成的绑定文件与prisma-binding运行时配合使用。无论你使用动态绑定直接new Prisma({ typeDefs, endpoint, secret })还是静态绑定使用生成产物调用方式都是统一的委托 APIconst { Prisma } require(prisma-binding) const prisma new Prisma({ typeDefs: src/generated/prisma.graphql, endpoint: https://your-prisma-service.com/myapp/dev, secret: my-super-secret-secret, }) // 查询单个用户 prisma.query.user({ where: { id: abc } }, { name }) // 创建用户 prisma.mutation.createUser({ data: { name: Sarah } }, { id }) // 判断节点是否存在 prisma.exists.User({ id: abc, name: Sarah })query、mutation、exists以及底层request方法的完整说明见 Prisma-Bindings API 文档。这些 delegate resolver 的接口签名是(args: any, info: GraphQLResolveInfo | string): PromiseT其中info既可以是选择集字符串也可以是 GraphQL 解析器透传的GraphQLResolveInfo对象——这正是在ctx.db.query.posts({}, info)这类“一行 resolver”中委托调用得以无缝衔接info的原因示例见 Overview 文档。小结prisma-binding的代码生成能力贯穿了“Schema 下载 → 绑定生成 → resolver 委托”的完整链路你可以用prisma-bindingCLI 直接基于prisma.graphql生成 TypeScript/JavaScript 绑定也可以把生成参数沉淀进.graphqlconfig.yml交由graphql codegen统一驱动再借助prisma.yml的post-deploy钩子实现部署自动生成。本仓库源码进一步表明这套思路在prisma generate中被扩展到了 Go、Flow 等多种语言且生成器内置了环境变量插值、标量类型映射等能力为构建类型安全、可持续演进的 Prisma GraphQL 服务提供了坚实的自动化基础。【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表