后端API网关【免费下载链接】crystal Graphiles Crystal Monorepo; home to Grafast, PostGraphile, pg-introspection, pg-sql2 and much more!项目地址https://gitcode.com/gh_mirrors/cry/crystal点击查看免费下载导读PostGraphile 会自动为数据库表生成 CRUD Mutations但真实业务往往需要更贴合逻辑的变更操作例如密码重置、接受团队邀请、批量插入文档。自定义 MutationCustom Mutations让你把任意业务逻辑封装成 PostgreSQL 函数PostGraphile 会把它自动暴露为符合 Relay Input Object Mutations Specification 的 GraphQL mutation 字段。读完本文你将掌握自定义 Mutation 的识别规则、完整 SQL 写法、SECURITY DEFINER等安全语义、pgStrictFunctions参数控制以及resultFieldName等 Smart Tag 对结果字段的定制技巧。一、为什么需要自定义 MutationPostGraphile 默认会为每张表生成createXxx、updateXxxById、deleteXxxById等 CRUD mutation但自动生成的变更很难覆盖真实业务逻辑——比如忘记密码需要在函数内部完成令牌生成、邮件发送、记录更新等一系列操作。官方文档给出的观点是很多人会直接通过--disable-default-mutations库版本对应disableDefaultMutations: true关闭自动 mutation然后用自定义 mutation 完全接管写操作。自定义 mutation 的典型优势业务逻辑集中在数据库端一个函数即可完成多次读写的原子性操作可以对函数加SECURITY DEFINER按需绕过 RLS 与 GRANT 检查官方文档明确警告这相当于sudo务必谨慎函数返回的复合类型、标量甚至SETOF集合都能直接映射为 GraphQL 的 payload 类型。这一设定在源码中有直接体现v4 预设实现 通过disableDefaultMutations动态禁用PgMutationCreatePlugin与PgMutationUpdateDeletePlugin两个插件为自定义 mutation 让路。二、函数成为自定义 Mutation 的识别规则要让 PostGraphile 把 PostgreSQL 函数识别为自定义 mutation必须同时满足以下规则遵守 PostGraphile 通用函数限制函数必须标记为VOLATILE这也是 PostgreSQL 函数的默认值函数必须定义在被 introspection 扫描的 schema 中。关于通用函数限制function-restrictions.md 列出的不支持项包括VARIADIC可变参数函数重载函数多个同名不同签名函数因为目前无法在 GraphQL 中整洁地暴露返回裸record的函数——因为不知道record包含哪些列无法映射成 GraphQL 类型解决方法是把record改成CREATE TYPE定义的复合类型名。三、Relay 兼容的输入对象形态满足上述规则的函数会被映射为符合 Relay Input Object Mutations Specification 的形式参数收进input输入对象返回值放进 payload 类型。官方文档示例CREATE FUNCTION my_function(a int, b int) RETURNS text AS $$ … $$ LANGUAGE sql VOLATILE;对应的 GraphQL 调用方式mutation { myFunction(input: { a: 1, b: 2 }) { text } }可以看到my_function变成驼峰命名的myFunctiona、b两个入参被收纳进input: { a: 1, b: 2 }函数返回的text标量成为 payload 上的text字段。具体可用的参数如clientMutationId可以在 Ruru / GraphiQL 的文档面板中查看。四、完整示例接受团队邀请官方文档给出了一个典型的自定义 mutation——acceptTeamInvite接受团队邀请它会生成对应的 GraphQL mutationCREATE FUNCTION app_public.accept_team_invite(team_id integer) RETURNS app_public.team_members AS $$ UPDATE app_public.team_members SET accepted_at now() WHERE accepted_at IS NULL AND team_members.team_id accept_team_invite.team_id AND member_id app_public.current_user_id() RETURNING *; $$ LANGUAGE sql VOLATILE STRICT SECURITY DEFINER;对该函数有几点官方说明值得留意STRICT可选当任一参数为NULL时函数不会被调用直接返回null且不报错。这让我们可以把teamId标记为必填参数。SECURITY INVOKER默认函数以调用者的安全上下文运行即谁调用就以谁的权限执行。SECURITY DEFINER函数以定义者通常是数据库所有者的安全上下文运行可以绕过 RLS、RBAC 等安全检查。官方文档提醒使用它要像使用sudo一样小心语言选择示例用LANGUAGE sql如果需要变量、循环、if 分支等能力可改用LANGUAGE plpgsql也可以使用LANGUAGE plv8JavaScript需安装扩展或 PostgreSQL 内置的 Python、Perl、Tcl 等语言。五、快速参考忘记密码Forgot password这是 examples 目录下的快速参考示例展示了基于 examples repo schema 运行真实查询的效果。注意示例 schema 使用了graphile-contrib/pg-simplify-inflector插件来简化字段命名相比默认的 inflector 规则字段名更短更直接。GraphQL 调用mutation { forgotPassword(input: { email: benjieexample.com }) { success } }对应的 PostgreSQL 函数大致如下函数体省略号处即业务实现create function forgot_password(email text) returns boolean language plpgsql volatile as $$ ... $$; -- 可选重命名结果字段 comment on function forgot_password(email text) is resultFieldName success;执行结果{ forgotPassword: { success: true } }这个示例展示了自定义 mutation 的两个关键点函数默认把返回的boolean映射为 payload 上的boolean字段通过resultFieldNameSmart Tag 把结果字段重命名为success从而让 GraphQL 返回更语义化的 payload。resultFieldName 的底层实现resultFieldName的解析逻辑在 PgV4InflectionPlugin 的functionMutationResultFieldName中实现如果资源带有extensions.tags.resultFieldName则直接返回该 tag 值否则按返回值类型回退到integer、float、boolean、string或匿名复合类型的默认命名。更详细的用法见 Smart Tags 文档其给出的典型场景即自定义 Mutation 函数在 mutation payload 类型上的字段名。例如procedure: { authenticate: { tags: { name: login, resultFieldName: token, } } }等价的 SQL Smart Comment 写法comment on function authenticate(text, text) is EresultFieldName token\nname login;六、pgStrictFunctions把参数按默认值推断必填/可选默认情况下PostGraphile 对函数参数的 nullability 判定遵循 PostgreSQL 语义。如果你希望没有默认值的参数一律必填非空、有默认值的参数可选可以开启pgStrictFunctions。官方文档特别指出这与给函数标记STRICT相似但有个微妙区别——pgStrictFunctions下带默认值的参数仍可显式传NULL而不会让整个函数返回 null。例如CREATE FUNCTION foo(a int, b int, c int 0, d int null) ...会生成 mutationfoo(a: Int!, b: Int!, c: Int, d: Int)——a、b无默认值故必填c、d有默认值故可选。库版本配置方式在 PostGraphile v4 的库用法中通过graphileBuildOptions传入app.use( postgraphile(connectionString, schemaName, { graphileBuildOptions: { pgStrictFunctions: true, }, }), );CLI 配置方式使用 CLI 时需要借助.postgraphilerc.js配置文件做类似设置。从源码看该选项在 v4 预设 中从graphileBuildOptions解构出来并接入构建流程因此它在 v4 兼容层中是被显式支持、有实现依据的选项。七、批量插入示例Bulk Insert自定义 mutation 也支持返回集合SETOF用于一次插入多行并返回全部记录的场景。官方文档的示例CREATE FUNCTION app_public.create_documents(num integer, type text, location text) RETURNS SETOF app_public.document AS $$ INSERT INTO app_public.document (type, location) SELECT create_documents.type, create_documents.location FROM generate_series(1, num) i RETURNING *; $$ LANGUAGE sql STRICT VOLATILE;要点返回类型SETOF app_public.document让 payload 携带多条记录generate_series(1, num)配合INSERT ... SELECT一次性插入num条STRICT保证num、type、location任一为NULL时不执行VOLATILE是自定义 mutation 的识别前提之一。八、mutation 没有出现的排查思路如果自定义 mutation 没有出现在生成的 schema 中可以从 CRUD Mutations 文档 的排查清单里定位原因这些原因同样适用于自定义 mutation 场景确认服务启动时没有输出相关错误检查是否设置了--disable-default-mutations或-M、.postgraphilerc中对应项确认表或函数没有被omitSmart Comment 屏蔽确认函数定义在被扫描的 schema 中且满足VOLATILE等规则见本文第二节若使用 GraphiQL务必在请求中使用mutation { ... }操作类型否则请求会被当作 query 解析看不到 mutation 字段。结语自定义 Mutation 是 PostGraphile v4 中把数据库逻辑与GraphQL API衔接起来的关键机制一个遵守识别规则的 PostgreSQL 函数即可自动变成 Relay 兼容的 mutation 字段配合STRICT、SECURITY DEFINER、pgStrictFunctions和resultFieldName等工具可以精确控制参数的必填性、执行权限与返回字段的语义。本文所有结论均可在当前仓库的 v4 文档、Smart Tags 文档 与 v4 预设源码 中找到对应依据读者可直接对照以上示例在自有数据库中实践。赞分享后端API网关【免费下载链接】crystal Graphiles Crystal Monorepo; home to Grafast, PostGraphile, pg-introspection, pg-sql2 and much more!项目地址https://gitcode.com/gh_mirrors/cry/crystal点击查看免费下载相关推荐PostGraphile 自定义变更Custom Mutations用 PostgreSQL 函数编写业务级 MutationPostGraphile 自定义变更Custom Mutations用 PostgreSQL 函数编写业务级 Mutation PostGraphile后端API网关PostGraphile v4 自定义变更Custom Mutations实战指南用 PostgreSQL 函数编写精确业务变更PostGraphile v4 自定义变更Custom Mutations实战指南用 PostgreSQL 函数编写精确业务变更 PostGraphile后端API网关PostGraphile v4 自定义查询Custom Queries实战指南用 PostgreSQL 函数自动生成 GraphQL 根字段PostGraphile v4 自定义查询Custom Queries实战指南用 PostgreSQL 函数自动生成 GraphQL 根字段 导读 本文围后端API网关上一篇Apache Kafka 3.1集群监控面板Grafana Dashboard配置下一篇Superfile深度解析现代终端文件管理器的架构设计与实战应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
本科毕设高分指南:深度学习人脸识别考勤系统全流程实现 简介:本资源是一套面向计算机专业本科生的深度学习实战项目,聚焦人脸识别考勤系统开发,专为毕业设计、课程设计及期末大作业打造。项目基于FaceNet深度学习算法实现高精度人脸特征提取与比对,完整覆盖人脸录入、实时识别、考勤统计… · 2026/9/23 21:54:44
医学图像分割实践:CTSpine1K三切面脊椎分割与U-Net适配 简介:面向医学图像分割研究与算法训练的骶骨脊椎CT分割数据集,源于CTSpine1K,覆盖轴位面、冠状面、矢状面三个切面,含5类语义标签。切片阶段剔除了ROI占比不足3%的低信息量图像,并使用医学影像常用窗宽窗位做对比度增强… · 2026/9/23 21:54:44
QLoRA量化微调实战:单卡24G跑65B大模型 简介:QLoRA是一套面向大语言模型量化微调实践的工具与实验资料,适合具备一定深度学习基础、希望以较低显存成本完成LLM指令微调的研究者与工程师。它围绕量化微调方法提供可复现的评测与生成数据,帮助模型在特定任务上获得更好适应与表现。资… · 2026/9/23 21:54:38
电视盒子救砖实战:移动创维E900V21C TTL串口与线刷双保险教程 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 1:28:19
DeepSeek本地化部署与DICOM分析模型微调实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 1:28:13
EtherCAT CIA402模式选型实战:CSP、CSV、CST如何正确选择 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 1:28:07
Proton Native 快速上手指南:用 React 语法与热重载构建跨平台桌面应用 桌面应用前端UI组件 【免费下载链接】proton-native A React environment for cross platform desktop apps 项目地址: https://gitcode.com/gh_mirrors/pr/proton-native 点击查看 免费下载 本指南基于 docs/quickstart.md 编写,带你从零开始安装 Prot… · 2026/9/24 1:28:07
Rust+Tauri数据库工具dbx:80+驱动静态集成与本地AI SQL实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 1:28:01
设备维护手册模板怎么设计:结构、字段与Word落地 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 1:27:55
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44