You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hasura如何针对PostgreSQL指定schema执行GraphQL查询?

实现动态切换appcompanyN schema查询的三种可行方案:

方案1:使用Hasura原生动态Schema路由(最适配动态新增schema的场景)

Hasura v2.0及以上版本原生支持多租户场景的动态schema路由,操作步骤如下:

  • 写个自动化脚本对接Hasura Metadata API,每次新生成appcompanyN schema时,自动调用接口跟踪该schema下的所有业务表,统一配置权限规则,不需要手动在控制台操作。
  • 前端发起查询请求时,在请求头中携带x-hasura-schema会话变量,值设置为当前需要查询的schema名(比如appcompany3),Hasura会自动将查询路由到对应schema下执行,你之前写的getCustomerList查询语句完全不需要修改。
  • 额外可以配合x-hasura-company-id这类自定义会话变量做权限限制,避免用户越权访问其他公司的schema数据。

方案2:用PostgreSQL自定义函数封装动态查询逻辑

如果不想调整Hasura的请求头配置,可以直接在数据库层面封装动态查询:

  1. 在public schema下创建接收schema名参数的PL/pgSQL函数,示例代码:
CREATE OR REPLACE FUNCTION public.get_customer_list(target_schema text)
RETURNS TABLE (
    customer_id int,
    -- 这里补全所有需要返回的字段,要和所有appcompanyN下customer表的字段结构完全一致
    name text,
    phone text
) 
LANGUAGE plpgsql 
SECURITY DEFINER
AS $$
BEGIN
    RETURN QUERY EXECUTE format(
        'SELECT customer_id, name, phone FROM %I.customer',
        target_schema
    );
END;
$$;
  1. 在Hasura控制台把这个函数跟踪为自定义GraphQL查询,之后就可以通过传参的方式指定查询的schema,查询示例:
query getCustomerList($targetSchema: String!) {
    get_customer_list(args: {target_schema: $targetSchema}) {
        customer_id
        name
        phone
    }
}

这个方案的优势是后续新增appcompanyN schema完全不需要修改Hasura配置,只要保证新schema下的customer表结构和函数定义的返回结构一致就可以直接使用。

方案3:前端动态拼接查询根字段(仅适合schema固定的场景,不推荐)

如果schema数量少且长期不变,你可以在Hasura跟踪表时给不同schema的customer表设置不同的根字段别名,比如appcompany1_customer、appcompany2_customer,前端根据用户选择的公司动态拼接查询的根字段名即可。但这个方案每次新增schema都要手动配置别名,维护成本极高,不适合你的场景。

内容的提问来源于stack exchange,提问作者ganjaam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:36:04