Hasura如何针对PostgreSQL指定schema执行GraphQL查询?
实现动态切换appcompanyN schema查询的三种可行方案:
方案1:使用Hasura原生动态Schema路由(最适配动态新增schema的场景)
Hasura v2.0及以上版本原生支持多租户场景的动态schema路由,操作步骤如下:
- 写个自动化脚本对接Hasura Metadata API,每次新生成
appcompanyNschema时,自动调用接口跟踪该schema下的所有业务表,统一配置权限规则,不需要手动在控制台操作。 - 前端发起查询请求时,在请求头中携带
x-hasura-schema会话变量,值设置为当前需要查询的schema名(比如appcompany3),Hasura会自动将查询路由到对应schema下执行,你之前写的getCustomerList查询语句完全不需要修改。 - 额外可以配合
x-hasura-company-id这类自定义会话变量做权限限制,避免用户越权访问其他公司的schema数据。
方案2:用PostgreSQL自定义函数封装动态查询逻辑
如果不想调整Hasura的请求头配置,可以直接在数据库层面封装动态查询:
- 在
publicschema下创建接收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; $$;
- 在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
相关产品推荐
相关产品推荐

