拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PostGraphile v5 连接(Connections)完全指南:游标分页、totalCount 与性能权衡

后端API网关【免费下载链接】crystal Graphiles Crystal Monorepo; home to Grafast, PostGraphile, pg-introspection, pg-sql2 and much more!项目地址https://gitcode.com/gh_mirrors/cry/crystal点击查看免费下载本文以 PostGraphile v5 官方文档 connections.md 为骨架结合仓库内presets/v4.ts、presets/relay.ts、behavior 文档与测试用例等源码级证据展开。读完你将掌握为什么 PostGraphile 默认用 Connection 而非纯列表、它对 Relay 游标规范的增强点totalCount/nodes/PageInfo、如何用 behavior 体系在连接与列表之间切换、以及如何做公平的基准测试对比。为什么 PostGraphile 默认返回 Connection 而不是数组当一个 GraphQL 字段预期返回大量数据库记录时PostGraphile 默认不会返回一个朴素的数组list而是实现一个符合 GraphQL Cursor Connections Specification 的连接connection并在此基础上做少量增强。这在 GraphQL 社区被视为最佳实践原因在于连接形态为 Schema 的后续演进留下了空间可以在连接层面扩展聚合aggregation能力例如aggregates、groupedAggregates字段可以通过edges暴露连接本身携带的元信息例如多对多连接表上的字段游标分页在“数据不断新增”的无限滚动场景如新闻流中表现稳定是普通分页无法提供的特性。从源码结构看连接相关行为由 graphile-build 系列插件的 behavior 系统驱动behavior.md 中列出了connection、resource:connection、resource:connection:filter、resource:connection:order、resource:connection:backwards等核心行为片段PostGraphile 正是通过这些行为决定是否为一个资源生成连接字段。PostGraphile 在 Relay 连接规范之上的三项增强除了 Relay 规范标准的edges、pageInfo、first/last/before/after之外PostGraphile 的连接额外提供增强项说明注意事项totalCount返回匹配查询条件的记录总数不包含游标/limit/offset 约束底层执行的是count(*)存在性能开销使用时需评估数据量与请求频率nodes仅返回节点数组去掉edge包装当你不关心每条记录的游标、只想要扁平数据结构时非常实用PageInfo.startCursor/PageInfo.endCursor分页起始与结束游标使用nodes { ... }而非edges { cursor, node { ... } }时配合它们即可继续分页一个典型的查询示例query UsersPage($first: Int!, $after: Cursor) { users(first: $first, after: $after) { totalCount nodes { id username } pageInfo { hasNextPage hasPreviousPage startCursor endCursor } } }仓库的测试用例中随处可见对这三项增强的验证例如postgraphile/postgraphile/__tests__/queries/polymorphic/目录下的*.test.graphql文件就包含totalCount字段的查询断言如person-app-vulns.app-totalCount.test.graphql、returns-setof.test.graphql而edges { ... }的标准遍历方式同样有大量测试覆盖如person-log-entries.after-caroline.test.graphql。测试输入文件.json5、预期 SQL 与 mermaid 执行计划图与之一一对应是研究连接如何被解析为数据库查询的一手资料。连接与过滤condition参数来自表、视图和关系的多数连接都支持过滤filtering即通过condition参数按等值条件筛选结果例如query UsersByCategory($category: ArticleCategory!) { users(condition: { category: $category }) { nodes { id username category } } }过滤的详细用法见 filtering.md。需要特别注意的是默认情况下 PostGraphile非 V4 preset不允许按未建立索引的列进行过滤若要强制某列出现在过滤选项中可对该列施加behavior filterBy智能标签用behavior -filterBy则可强制移除。在 v4.ts 的entityBehavior中可以看到类似逻辑tsvector/tsquery、数组/范围类型以及二进制类型会被自动加上-condition:attribute:filterBy以保证过滤行为不会对未索引或不适合过滤的列生效。性能建议Connection 还是 List连接比纯列表更复杂因此带有一定的性能开销。PostGraphile 官方文档的立场是这通常是值得的权衡因为连接带来的未来扩展空间版本无关 Schema 理想和游标分页能力是普通分页无法替代的。但如果你对性能极其敏感或更喜欢简单列表完全可以通过 behaviors 配置偏好。全局关闭连接、开启列表在graphile.config.mjs中设置defaultBehaviorconst preset { schema: { defaultBehavior: -connection list, }, }; export default preset;效果PostGraphile 生成列表list字段而不再生成连接connection字段。同时保留两者如果希望两种形态并存可配置为const preset { schema: { defaultBehavior: connection list, }, };按实体粒度精确控制你还可以通过 智能标签 smart tags 对单个表、视图、列甚至虚拟约束进行behavior覆盖详见 smart-tags.md 中behavior一节它支持comment on table ... is ...这样的数据库注释形式。这意味着“全局默认连接、个别实体改列表”或反之都完全可行。从源码看 behavior 如何落地defaultBehavior是全局默认行为优先级低于实体自身行为最终行为字符串由“插件默认行为 → 全局默认行为 → 插件推断行为 → 实体行为”逐级拼接越靠后的优先级越高见 behavior.md 的“Determining entity behavior”一节。仓库中的两个 preset 是很好的对照样本v4.ts 中的 V4 兼容插件把旧的simpleCollections选项only | both | omit翻译成行为字符串only对应-connection -resource:connection list resource:listboth对应两者都开启omit则偏好连接并禁用列表。这是从 V4 迁移到 V5 时控制集合形态的便捷入口。relay.ts 中的实验性PgRelayPlugin则通过globalBehavior设置了connection、-list等行为让 Schema 更贴合 Relay 的习惯如将id作为 nodeId 字段名、优先连接而非列表。排查某实体最终行为时官方提供了一条调试命令npx graphile behavior debug它由utils/graphile/src/cli.ts注册见 cli.ts子命令实现位于 utils/graphile/src/commands/behavior/debug/cli.ts可传入实体类型、标识与过滤字符串快速确认是哪些行为片段胜出及其原因。基准测试务必保证对比公平文档特别强调比较两个 GraphQL 服务器性能时必须保证双方要么都用列表、要么都用连接否则对比毫无意义。PostGraphile 默认采用连接最佳实践而许多其他实现默认返回列表二者在生成 SQL 与执行计划上的差异会直接污染测试结果。如果你看到某篇研究论文在对比不同 GraphQL 服务器性能时没有做到这种基本等价性那么它的结论至少是存疑的官方建议不要依据这类低质量研究做任何决策。若要与其他软件进行公平对比可以参考以下思路通过上文defaultBehavior: -connection list让 PostGraphile 生成列表或通过 V4 兼容插件的simpleCollections: only对应 v4.ts 的选项快速切换到纯列表模式目标 schema 若有其他差异如命名、过滤参数、空值策略PostGraphile 高度可配置可进一步调整使其与目标 schema 尽可能相似——这正是文档所承诺的虽然默认使用连接等最佳实践但你可以轻松更改设置以匹配那些以性能或简洁性优先的其它方案。小结PostGraphile v5 的连接机制围绕 Relay 游标分页规范构建并附加totalCount、nodes、PageInfo.startCursor/endCursor三项实用增强默认行为可以在defaultBehavior、插件globalBehavior与实体级智能标签三个层面灵活调节兼顾最佳实践与性能诉求。无论是构造带过滤的分页查询、在连接与列表间切换还是设计公平的基准测试理解本文所述的 behavior 体系与源码对应关系都能让你更精准地驾驭 PostGraphile 的 Schema 形态。延伸阅读仓库内相关文档过滤Filteringcondition参数的完整说明与高级过滤方案行为系统Behavior行为字符串语法、优先级与核心行为清单智能标签Smart Tagsbehavior等标签的数据库注释写法关系Relations多对一/一对多关系字段与连接的配合赞分享后端API网关【免费下载链接】crystal Graphiles Crystal Monorepo; home to Grafast, PostGraphile, pg-introspection, pg-sql2 and much more!项目地址https://gitcode.com/gh_mirrors/cry/crystal点击查看免费下载相关推荐PostGraphile 连接Connections指南基于 Relay 规范的游标分页与增强实践PostGraphile 连接Connections指南基于 Relay 规范的游标分页与增强实践 导读 本文围绕 PostGraphile v4 文档中后端API网关PostGraphile Connections 完整指南Relay 游标分页增强、行为配置与性能基准PostGraphile Connections 完整指南Relay 游标分页增强、行为配置与性能基准 PostGraphile 为所有返回大量数据库记录的字后端API网关Relay 连接Connections分页机制完全指南基于游标的分页原理与 usePaginationFragment 实战Relay 连接Connections分页机制完全指南基于游标的分页原理与 usePaginationFragment 实战 导读 在构建数据驱动的 Re前端开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门