使用 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),仅供参考

相关新闻

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:34 阅读更多 →
安卓、苹果、鸿蒙开发有什么区别?一文看懂三大移动开发平台

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

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

2026/9/24 16:30:34 阅读更多 →
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:34 阅读更多 →

最新新闻

Agent Skills:让AI Agent从“有工具”到“会干活”的实战指南

Agent Skills:让AI Agent从“有工具”到“会干活”的实战指南

如果你也在折腾AI Agent,一定遇到过这种场景:模型能力很强,工具也接了一堆,可它一遇到稍微复杂的情况就掉链子,要么压根不知道该调什么,要么调了却用不对参数。我前段时间接手一个内部自动化项目&#xff0…

2026/9/24 22:38:36 阅读更多 →
Java面试真题集锦:从HashMap到JVM与并发编程的体系化备战指南

Java面试真题集锦:从HashMap到JVM与并发编程的体系化备战指南

每年到了二三月份和九十月,牛客网上就像赶大集一样热闹,各种Java面经满天飞,有人刷题刷到凌晨三点,有人拿着 offer 在帖子里报喜。我从几年前开始招人,这几年陆陆续续面过了两三百个候选人,也帮朋友改过不少…

2026/9/24 22:38:36 阅读更多 →
AI安全审计技能化:从提示词到可复用Skill的完整实践指南

AI安全审计技能化:从提示词到可复用Skill的完整实践指南

直接说结论:把安全审计这种“高重复、强规则、容错率低”的活儿交给AI,最好的落地方式不是现写一次性提示词,而是把它固化成一套可复用的技能包,也就是现在社区里常说的Skill。我最近做完的这个security-audit-skill,就…

2026/9/24 22:38:36 阅读更多 →
网络热词“cua”解码:从拟声词到弹幕文化的流行密码

网络热词“cua”解码:从拟声词到弹幕文化的流行密码

刷短视频的时候,一条猫从镜头前飞窜过去,弹幕里齐刷刷飘过一串“cua”;群里聊到某个东西刚上架就售罄,有人跟一句“cua一下没了”;就连朋友发消息秒撤回,也有人吐槽“cua,啥也没看着”。你要是最…

2026/9/24 22:38:36 阅读更多 →
Java面试高频真题备战:考点拆解与答题框架

Java面试高频真题备战:考点拆解与答题框架

不少人在后台问我,牛客网上那些Java面试真题到底该怎么刷才有效,是不是把答案背下来就稳了。说实话,我面试过不少候选人,也在牛客网刷过很多题,见过太多“背得很熟但一追问就露馅”的情况。这篇内容我打算把自己反复研…

2026/9/24 22:38:36 阅读更多 →
EMC测试中30MHz分界线:传导发射与辐射发射的物理奥秘与整改实战

EMC测试中30MHz分界线:传导发射与辐射发射的物理奥秘与整改实战

做EMC测试的老哥估计都问过这个问题:传导发射(CE)测得好好的,一测到30MHz,标准就喊停;换到辐射发射(RE),嘿,又从30MHz开始测。两个频段无缝衔接,跟…

2026/9/24 22:37:35 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →