PROD欧洲主权BaaS平台打开仪表板 →

工程 · 10 最小读取值

pg_graphql 与 Postgres 上的 Hasura 和 PostGraphile

Affane Daylami · Fondateur · 2026年7月31日

返回博客

Postgres 上的 GraphQL API 的含义因工具而异。 PostGraphile 部署一个单独的 Node 服务器。 Hasura 在数据库前面部署了 GraphQL 引擎。 pg_graphql 在 Postgres 中运行——这是 Aurabase 采取的方法。这不是一个实施细节:它改变了您需要托管、保护和维护的内容。

该英文文本是根据法文原文自动生成的,尚未经过审查。
该页面已自动翻译。英文版具有权威性。

pg_graphql 是由 Supabase 维护的开源 Postgres 扩展 — 它不是 Aurabase 的发明。我们构建的是其与平台的原生集成和选择性集成:每个项目都需要检查的框,而不是要提供的服务。这篇文章详细介绍了实际的架构,展示了如何启用它,并诚实地比较了 Hasura 和 PostGraphile v5 的权衡。

要点
  • pg_graphql 在 Postgres 中作为 SQL 扩展运行——与 Hasura 和 PostGraphile 不同,无需部署单独的 GraphQL 服务器。
  • Aurabase 提供的包装函数是 SECURITY INVOKER:您的 RLS 策略自动应用,无需并行维护第二个权限系统。
  • 仅针对每个项目选择激活 — aura projects graphql-enable 或 Studio — 默认情况下不会在任何项目上激活。
  • Hasura 于 2025 年 6 月正式重新将重点放在 PromptQL 和 AI 代理上,但没有放弃其 GraphQL 引擎。
  • PostGraphile v5 于 2026 年 3 月 24 日全面上市——是一个直接且活跃的竞争对手,而不是一个休眠项目。
#
概述

pg_graphql,一句话

pg_graphql 内省您的 SQL 模式并生成符合 Relay 约定的 GraphQL 模式 — <table>Collection、 edges、 node、按列类型过滤、按游标分页。无需手动编写或维护 SDL:GraphQL 架构遵循 Postgres 架构。

对于架构来说重要的一点是:这个模式生成器位于数据库内部,作为 SQL 函数,而不是作为旁边的 HTTP 进程。 Aurabase 将 1.6.1 版本的扩展(于 2026 年 5 月 7 日发布)固定在其 Postgres 映像 中 — 与 Supabase 分发的官方 .deb 软件包相同。它安装在共享集群和专用 Postgres 实例上。

如果您来自 Supabase,那里 pg_graphql 已经本地启用了很长时间,您会熟悉其中的逻辑。我们详细的 比较 和我们的 迁移指南 涵盖了 RLS 架构和策略的其余部分,它们保持不变。

#
背景 2026

Hasura 和 PostGraphile 发生了什么变化

“Postgres 上的即时 GraphQL”的两个历史竞争对手都没有消失。他们的定位已经发生了变化,更新的文章应该反映这一点,而不是引用两年前的状态。

Hasura 于 2025 年 6 月发表了一篇文章,标题明确为 “从 GraphQL 到 PromptQL:新篇章开始”,由其联合创始人 Tanmai Gopal 签名。传达的信息是:该公司正在将其路线图重新集中在 PromptQL上,这是一个专为人工智能代理设计的数据访问层。 GraphQL 引擎并未被删除——Hasura 的主页仍然将其显示为“经过考验”——但它不再是优先消息。

PostGraphile则相反。其版本 5 自 2023 年以来以 Beta 形式开发,并于 2026 年 3 月 24 日全面发布,并配备了名为 Grafast 的新查询计划引擎。这并不是一个即将失去动力的项目:最后一个版本 5.1.4 的日期是 2026 年 8 月 5 日。仅在 2026 年 8 月 16 日至 22 日这一周,npm 软件包 的下载量就达到了 119,230 次(npm 注册表,2026 年 8 月 23 日查阅)。

阿斯图塞

实际后果:真正的空闲空间不是“Postgres 上的 GraphQL,没有人触及它”——而是特定的 GraphQL 零配置槽,通过一个命令激活,没有托管服务。哈苏拉通过战略选择远离它; PostGraphile 从未针对过它,它的模型仍然是“自行集成 Node.js 库”。

#
建筑

每个解决方案实际转向的地方

构成其他一切(运营成本、攻击面、延迟)的差异在于 GraphQL 引擎的运行位置。

转向何处SQL 扩展,在 Postgres 中单独的 GraphQL 服务器 (Go),位于 Postgres 前面Node.js 库/服务器,领先于 Postgres
需要部署无 — 由项目标志激活是的 — 托管并扩展 Hasura 引擎是的 - 托管 Node 进程或将其与您的服务器集成
权限模型旧版 Postgres RLS(安全调用者)Hasura 自己的权限系统,每个角色/表RLS Postgres 通过 pgSettings — 也是本机委托
默认自省残疾人取决于发动机配置取决于服务器配置
定位2026Postgres BaaS 的本机选项自 2025 年 6 月起重新关注 PromptQL/IAGA v5 自 2026 年 3 月起,活跃项目
光环基地哈苏拉后记V5

老实说:PostGraphile 还通过 pgSettings 和角色切换将授权委托给 Postgres — 原生 RLS 并不是 pg_graphql 独有的。仍然不同的是谁托管和配置这个桥:在 PostGraphile 是你;在 PostGraphile 是你;在在 Aurabase,这已经完成了。

#
在引擎盖下

Aurabase 如何在项目上激活 pg_graphql

激活是按项目选择加入的,并为 Postgres 引擎项目保留 — MongoDB 项目拒绝请求 (GRAPHQL_UNSUPPORTED_ENGINE),pg_graphql 是 Postgres 扩展,在其他引擎上没有等效项。

通过 CLI 或直接调用管理计划:

terminalbash
# 幂等:调用已激活的项目不会重新创建任何内容
aura projects graphql-enable <project_id>

# HTTP 等效项(管理平面、JWT 控制台)
curl -X POST "$AURA_CONTROL_URL/v1/control/projects/$PROJECT_ID/graphql/enable" \
  -H "Authorization: Bearer $CONSOLE_JWT"

在服务器端,调用执行配置程序在单个事务中执行的 graphql_enable 作业:安装扩展、在架构中创建 graphql() 函数、授予应用程序角色。如果某个步骤失败,一切都会被取消 - 永远不会半途安装包装器,并且 graphql_enabled 仅在完全成功后才会移动到 true。

它既可以在共享的 Postgres 集群上运行,也可以在每个项目的专用 CNPG 实例上运行 - 两个不同的 Postgres 映像,但具有相同的扩展机制。在专用实例上,扩展是通过 CNPG 运算符的声明性清单安装的,而不是直接 SQL — 这是最近的更正。专用集群无需应用程序超级用户访问权限即可运行,而 pg_graphql 的 CREATE EXTENSION恰恰需要此权限。

在 Studio 中,相同的流程经过“表配置”选项卡。那里的按钮可以激活项目级别的扩展 - 与上面相同的 HTTP 调用,轮询直到收敛。然后,第二个控件为每个表设置一个 @graphql 指令,以激活或不激活 totalCount 及其 GraphQL 集合上的聚合字段,而无需离开编辑器。

单个命令视图:激活 → 配置作业线程化(幂等,如果已在运行则无操作)→ DDL 事务(扩展、包装函数、GRANT)→ 仅在完全成功后设置标志 graphql_enabled → 可以通过 /rpc/graphql请求。

#
安全性

旧版 RLS,无需维护第二个系统

Aurabase 设置的函数是 SECURITY INVOKER — Postgres 的默认行为,经过解释,以便将来的重构不会意外更改它。它以实际调用者的权限运行(aura_anon、 aura_authenticated 或 aura_service_role,具体取决于 JWT 声明),因此您的 RLS 策略 完全适用于 REST 请求。

为什么不选择安全定义者

SECURITY DEFINER 函数将绕过整个 RLS — 内部检查:在超级用户连接下调用 graphql.resolve 而不更改应用程序角色会返回所有所有者的行,无论是否为 RLS。这种选择正是避免了跨租户风险。

在 Hasura,架构在构造上有所不同:引擎将每个 GraphQL 查询转换为受 Hasura 特定权限规则约束的 SQL 查询。这些规则是在其自己的层中为每个角色和每个表定义的——Postgres RLS 的并行系统,而不是其委托。审计访问规则的地方有两个,而不是只有一个。

默认情况下,每个 Aurabase 项目上的自省 ({ __schema { ... } }) 保持禁用状态 — 这种状态与平台的其他部分一致。如果 Apollo Studio 或 graphql-codegen 等工具需要它,它可以通过 COMMENT ON SCHEMA 由模式激活。

#
教程

启用然后查询您的 GraphQL API

一旦 graphql_enabled 到 true,网关上就不会出现专用的 /graphql 路由。该请求通过通用 RPC 代理,就像从 SDK 调用的任何 Postgres 函数一样。

query.shbash
curl -X POST "$AURA_URL/v1/db/$PROJECT_ID/rpc/graphql" \
  -H "apikey: $AURA_ANON_KEY" -H "Authorization: Bearer $JWT" \
  -H "Content-Type: application/json" \
  -d '{"query":"query { postsCollection(first: 10, filter: { published: { eq: true } }) { edges { node { id title created_at } } } }"}'

响应遵循 GraphQL 规范 — { data, errors } — 无需额外的 Aurabase 包装:网关检测到目标 RPC 是 graphql 并且不会重新包装它,这与普通 RPC 不同。标准 GraphQL 客户端(Apollo、urql、graphql-request)按原样使用输出。

激活时默认设置两个设置,通过图中的 @graphql 指令: max_rows: 1000 和 inflect_names: true。 pg_graphql 默认情况下每个集合的上限为 10,000 行 — 如果没有 first:,大表可能会导致内存饱和。 inflect_names 提供可读的类型名称,而不是 SQL 表的原始 Snake_case。

#
限制

pg_graphql 还没有做什么

本着本博客的精神,要记录而不是隐藏。

  • 没有本机 GraphQL 订阅。 pg_graphql 涵盖查询和突变,而不是实时 subscriptions — 这是扩展本身的限制,而不是 Aurabase 的遗漏。实时 Aurabase 存在,但通过单独的通道 (postgres_changes),而不是 GraphQL 订阅桥。
  • 没有 Hasura 那样的声明性操作。 “连接到 GraphQL 突变的业务 Webhook”模型没有直接等效项 - 在 Aurabase 上,此逻辑通过 Postgres 函数或 Edge 函数,而不是通过专用的 GraphQL 配置。
  • 为 Postgres 引擎保留。 MongoDB 项目无法启用此功能 — 无意解决此问题。
信息

为什么激活仍然是选择加入而不是默认激活:租户数据库的 GRANT/Roles 区域有记录的回归历史记录。这足以证明,在考虑更广泛的缺陷之前,如果没有逐个项目的明确验证,任何功能都不会触及它。

#
决定

Aurabase、Hasura 或 PostGraphile:取决于您的上下文

所有三个选项都是合理的 - 正确的选择取决于您已经拥有的以及您希望避免的。

  • Aurabase 上的 pg_graphql — 如果您的 RLS 数据库和策略已存在于 Aurabase 上,并且您希望采用第二种方式来查询它,而无需监视其他服务。
  • Hasura — 如果您在单个 GraphQL 模式后面联合多个数据源(不仅仅是 Postgres),或者 PromptQL 及其 AI 代理方法适合您的路线图。
  • PostGraphile v5 — 如果您想精细控制通过其插件系统生成的模式,并且您已经运行了一个 Node.js 服务器来集成它。

有关完整查询语法 - 按列类型过滤、orderBy排序、按游标分页、insertInto<Table>Collection 突变 - 请参阅官方 pg_graphql文档。下面的 Aurabase GraphQL 文档也详细介绍了整个周期。

准备好部署了吗?

五分钟内完成您的后端。

无需信用卡 · 500 MB 免费 · 50,000 MAU