尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
使用 prisma-binding 构建基于 Prisma 服务的 GraphQL 服务器
使用 prisma-binding 构建基于 Prisma 服务的 GraphQL 服务器【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1导读prisma-binding是专门为 Prisma 服务设计的 GraphQL binding 实现它为在 Prisma 服务之上构建 GraphQL 服务器提供了一层便捷封装你可以把查询、变更的执行委托给底层 Prisma 数据库服务的 API而不必在 resolver 里手写 SQL 或直接调用 MongoDB 等 NoSQL API。读完本文你将掌握Prisma实例的实例化方式、query/mutation/exists/request四个核心 API 的用法以及如何用生成的 delegate resolver 函数把大多数 resolver 写成一行代码。Prisma Binding 是什么prisma-binding是一个专门面向 Prisma 服务的 GraphQL binding。它提供的是一层便捷层convenience layer用于在 Prisma 服务之上构建 GraphQL 服务器。简单来说它通过把查询或变更的执行委托给底层 Prisma 数据库服务的 API极大简化了 GraphQL resolver 的实现大多数 resolver 不再需要编写 SQL也不需要在 resolver 内部直接访问 MongoDB 这类 NoSQL 数据库 API而只是简单的单行调用。在本文档对应的 1.4 版本中Prisma Bindings 章节位于 docs/1.4/04-Reference/08-Prisma-Bindings包含 Overview 与 API 两个部分前者介绍整体思路与使用流程后者给出完整的 API 参考。核心示例把 resolver 写成一行代码假设你的 GraphQL 服务器有一个这样的应用 schemaapplication schema# import Post from ./generated/prisma.graphql type Query { posts: [Post!]! post(id: ID!): Post description: String! } type Mutation { createDraft(title: String!, text: String): Post deletePost(id: ID!): Post publish(id: ID!): Post }对应的 resolver 实现如下。注意每个 resolver 都通过ctx.db上自动生成的委托函数把实际执行委托给 Prisma 服务并将info透传下去以保证查询的选择集selection set能原样作用于底层 APIconst resolvers { Query: { posts(parent, args, ctx, info) { return ctx.db.query.posts({ }, info) }, post(parent, args, ctx, info) { return ctx.db.query.post({ where: { id: args.id } }, info) }, }, Mutation: { createDraft(parent, { title, text }, ctx, info) { return ctx.db.mutation.createPost( { data: { title, text, }, }, info, ) }, deletePost(parent, { id }, ctx, info) { return ctx.db.mutation.deletePost({ where: { id } }, info) }, publish(parent, { id }, ctx, info) { return ctx.db.mutation.updatePost( { where: { id }, data: { isPublished: true }, }, info, ) }, }, }这段代码背后对应的 Prisma 数据模型data model会生成包含完整 CRUD API 的generated/prisma.graphql即文档中提到的database.graphqlPost类型及其createPost、updatePost、deletePost、posts、post等根字段全部由 Prisma 服务的模式定义自动推导而来。你可以在 docs/1.4/04-Reference/03-Prisma-API 章节中进一步了解 Prisma 自动生成的 Query / Mutation API 形态。使用 Prisma Binding 构建服务器的五个步骤官方文档给出了使用 Prisma binding 构建 GraphQL 服务器的标准工作流创建 Prisma 服务先定义数据模型data model创建你的 Prisma service。下载生成的数据库 schema即database.graphql其中包含完整的 CRUD API生成文件通常位于generated/prisma.graphql。定义应用 schema一般命名为app.graphql描述你的 GraphQL 服务器对外暴露的 API。实例化Prisma传入关于你的 Prisma 服务的信息例如服务 endpoint 以及数据库 schema 定义文件的路径。实现 resolver为应用 schema 的各个字段实现 resolver通过生成的 delegate resolver 函数把执行委托给底层 Prisma 服务。如果你使用 GraphQL boilerplate 项目例如通过graphql create创建Prisma binding 通常已经预先配置好并为你实现了一部分示例 resolver。示例工程会区分两种绑定形态动态绑定dynamic binding如node-basicboilerplate与静态绑定static binding如typescript-basicboilerplate后者配合代码生成能获得更强的类型安全。安装在 Node.js 项目中使用 yarn 或 npm 安装yarn add prisma-binding # or npm install --save prisma-bindingAPI 参考实例化与基础 CRUD考虑如下的 Prisma 服务数据模型type User { id: ID! unique name: String }基于该服务实例化Prisma之后就可以发送以下查询/变更// 基于具体的服务实例化 Prisma const prisma new Prisma({ typeDefs: schemas/database.graphql, endpoint: https://api.graph.cool/simple/v1/my-prisma-service secret: my-super-secret-secret }) // 查询某个用户的 name prisma.query.user({ where { id: abc } }, { name }) // 查询所有用户的 id 和 name prisma.query.users(null, { id name }) // 创建名为 Sarah 的用户并返回 id prisma.mutation.createUser({ data: { name: Sarah } }, { id }) // 更新某个用户的 name 为 Sarah 并返回 id prisma.mutation.updateUser({ where: { id: abc }, data: { name: Sarah } }, { id }) // 删除某个用户并返回 id prisma.mutation.deleteUser({ where: { id: abc } }, { id })在底层这些函数调用中的每一个都会被翻译成一次针对你的 Prisma 服务的真实 HTTP 请求通过graphql-request实现你无需手动拼写完整的查询字符串也不必关心 HTTP 传输细节——这些全部由 delegate resolver 函数在内部处理。API 还支持询问某个节点是否存在于 Prisma 数据库中// 询问是否存在一个 id 为 abc 的 post // 且其 author 名为 Sarah返回布尔值 prisma.exists.Post({ id: abc, author: { name: Sarah } })constructor 与 PrismaOptions构造函数签名如下constructor(options: PrismaOptions): PrismaPrismaOptions类型的字段如下表所示KeyRequiredTypeDefaultNoteschemaPathYesstring-你的 Prisma 服务 schema 定义的文件路径通常是一个名为database.graphql的文件endpointYesstring-你的 Prisma 服务的 endpointsecretYesstring-你的 Prisma 服务的 secretfragmentReplacementsNoFragmentReplacementsnull一组 GraphQL fragment 定义指定 resolver 正常工作所需的字段debugNobooleanfalse将所有的查询/变更打印到控制台其中fragmentReplacements是一个值得留意的选项当你的 resolver 依赖某些嵌套字段例如关系字段的子选择时可以通过 fragment 把这些必需字段注入到底层查询中确保委托执行时不会遗漏。debug则用于排查问题——打开后所有发往 Prisma 服务的查询/变更都会输出到控制台便于观察实际发送的 GraphQL 语句。query 与 mutationquery和mutation是Prisma实例上的两个公开属性。它们的类型均为Query暴露一组自动生成的 delegate resolver 函数函数命名与 Prisma 数据库 schema 中Query和Mutation类型上的字段一一对应例如上面的users、user、createUser、updateUser、deleteUser。每个 delegate resolver 本质上都是一个便捷 API你无需从头拼写完整的查询/变更也不用操心通过 HTTP 发送的问题这一切都在 delegate resolver 函数内部处理完毕。delegate resolver 的接口如下(args: any, info: GraphQLResolveInfo | string): PromiseT参数的使用方式args携带查询/变更潜在参数的对象info表示查询/变更选择集的对象既可以直接用字符串表达如{ id name }也可以用GraphQLResolveInfo形式传入在 resolver 中通常直接透传来自 GraphQL 执行层的info。泛型类型T对应各自字段的类型。existsexists同样是Prisma实例上的公开属性。与query、mutation类似它也暴露一组自动生成的函数但每个类型只对应一个函数。函数命名遵循能检索该类型单个节点的根字段的规则例如类型User对应User函数。它接收一个where对象作为输入返回一个boolean值表示where表达的条件是否被满足。该函数让你能够方便地检查 Prisma 数据库中是否存在某个特定类型的节点——例如在权限校验、防重复创建等场景中非常实用。requestrequest方法允许你直接向 Prisma 服务发送 GraphQL 查询/变更。其功能与自动生成的 delegate resolver 相同但 API 更加冗长——因为你需要自己拼写完整的查询/变更。request底层同样使用graphql-request实现。使用示例const query query ($userId: ID!){ user(id: $userId) { id name } } const variables { userId: abc } prisma.request(query, variables) .then(result console.log(result)) // sample result: // {data: { user: { id: abc, name: Sarah } } }可以看到request适合需要完全掌控查询文本的场景例如动态拼接查询、批量执行等而日常的 resolver 委托则优先使用自动生成的 delegate resolver。从文档结构与版本演进看 Prisma Binding在仓库中Prisma Bindings 是 Prisma 参考文档04-Reference的固定章节从 docs/1.4/04-Reference/08-Prisma-Bindings 到 docs/1.10/04-Reference/08-Prisma-Bindings 均有完整章节同时 docs/1.0/06-GraphQL-Ecosystem/02-GraphQL-Binding 从 GraphQL 生态视角介绍了 binding 的一般思想与 Prisma binding 的定位。由此可以看出Prisma binding 是官方推荐的在 Prisma 之上构建 GraphQL 服务器的核心手段与 docs/1.4/04-Reference/03-Prisma-API 中描述的自动生成 API 紧密配合。在后续版本1.10 及之后中prisma-binding还演进出了代码生成codegen能力通过内置的生成器 CLI可以把prisma.graphql生成静态类型的 binding 文件TypeScript / JavaScript并可与 GraphQL Config 集成——在.graphqlconfig.yml的extensions.codegen中声明generator: prisma-binding与language: typescript之后只需执行graphql codegen即可完成生成详见 docs/1.10/04-Reference/08-Prisma-Bindings/03-Code-generation.md。这种静态绑定方案正是typescript-basicboilerplate 所采用的形态。小结prisma-binding通过委托执行的设计把 Prisma 自动生成的数据库 CRUD API 包装成可编程、可组合的 delegate resolver 函数Prisma实例化只需schemaPath、endpoint、secret三个必要参数另可选用fragmentReplacements与debugquery/mutation暴露按字段自动生成的委托函数配合args info的接口即可在 resolver 中透传选择集exists提供按类型的存在性判断request提供完全自定义的查询发送能力结合后续版本引入的 codegen还可以进一步生成类型安全的静态 binding。对于想要快速在 Prisma 服务之上搭建业务 GraphQL 层的开发者这一层封装能够显著减少样板代码让 resolver 保持简洁、可读且易于维护。【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

linux系统中间件测试报告

linux系统中间件测试报告

渗透测试报告 — 192.168.100.135(Ubuntu 多服务主机) 项目 内容 测试时间 2026-09-23 测试环境 Kali Linux 2026.2(WSL2,本机 172.19.78.191,经宿主机 192.168.100.1 路由) 授权状态 用户声明已获目标授权…

📅 2026/9/24 16:30:18
安卓、苹果、鸿蒙开发有什么区别?一文看懂三大移动开发平台

安卓、苹果、鸿蒙开发有什么区别?一文看懂三大移动开发平台

前言 我们每天都在使用手机 App:聊天、购物、刷视频、导航、学习…… 但是,一个 App 到底是怎么开发出来的?为什么有的 App 运行在 Android 手机上,有的 App 只能在 iPhone 上使用?鸿蒙开发又和 Android、iOS 有什么…

📅 2026/9/24 16:30:18
Model-Driven Quantum Code Generation Using Large Language Models and Retrieval-Augmented Generation

Model-Driven Quantum Code Generation Using Large Language Models and Retrieval-Augmented Generation

论文总结与翻译 一、文章主要内容 本文聚焦于量子及混合量子-经典软件系统,提出一种利用大型语言模型(LLMs)并结合检索增强生成(RAG)管道的模型到文本/代码转换新研究方向,旨在降低该领域因平台异构性和开发者技能不足带来的成本与风险。 1. 研究背景 技术现状:模型驱…

📅 2026/9/24 16:30:18
MORE NEWS

更多资讯

📰

全球高导热硅胶片定制服务避坑挑选指南:燊桐启元价格公道不玩套路

开篇品牌摘要深圳市燊桐启元电子科技有限公司是一家专注于电子材料研发、生产与销售的高新技术企业,主营业务为高导热硅胶片、精密陶瓷材料及电磁屏蔽材料的定制化方案解决,服务覆盖半导体封装、5G通信、新能源汽车、工业制造等多个高技术密集型领域。企…

📰

Instagram 账号运营怎么开始 先分清主页与内容目标

建立 Instagram 主页和内容协同的运营框架的数据分析和 96SMM 产品支持 主页负责说明身份、价值和下一步入口,内容负责触达与互动。先保证主页能承接,再围绕明确主题持续发布并用 Insights 复盘。 本文按“明确问题、完成内容、记录数据、诊断原因、选择…

📰

ACME控火毯值得信赖吗

与产业同频,在防火应急赛道稳步前行随着国内新能源汽车产业的快速发展,锂电池热失控引发的车辆火灾逐渐成为公共安全领域新的痛点,传统消防装备在这类高温火情场景中暴露出越来越多的适配短板。从察觉到行业需求缺口到推出成熟的专用解决方案…

📰

Instagram 多条内容怎么比较 建立统一复盘表

比较多条 Instagram 内容而不混淆口径的数据分析和 96SMM 产品支持 先按格式分组,再比较相同观察窗口内的数据。跨格式只讨论各自完成目标的程度,不直接按播放或互动总量排名。 本文按“明确问题、完成内容、记录数据、诊断原因、选择支持、进入下一轮”…

📰

Instagram 推广预算怎么拆 内容广告与服务分开记录

建立清晰的 Instagram 推广预算表的数据分析和 96SMM 产品支持 每项费用购买的交付不同。内容预算、Meta 广告、工具和第三方服务必须分开记录,并分别核对交付和业务结果。 本文按“明确问题、完成内容、记录数据、诊断原因、选择支持、进入下一轮”的顺序展开。官方…

📰

OpenFOAM二次开发教程(06):有限体积离散与方程装配——fvMatrix 与 fvm/fvc 算子

OpenFOAM二次开发教程&#xff08;06&#xff09;&#xff1a;有限体积离散与方程装配——fvMatrix 与 fvm/fvc 算子版本与事实声明 fvMatrix 的求解接口见官方 Doxygen fvMatrix.H&#xff1a;提供 SolverPerformance<Type> solve(fvMatrix<Type>&, const wor…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬