PostGraphile中如何为PostgreSQL函数返回值指定自定义返回字段名
方案1:使用OUT参数修改函数定义(推荐,适配所有返回类型)
直接在函数参数列表末尾添加OUT result <返回类型>,删掉原有的RETURNS <类型>声明,将原RETURN语句改为对result变量赋值即可,PostGraphile会自动将OUT参数名作为返回字段名。
改造后的函数示例:
CREATE OR REPLACE FUNCTION it_exists( email text, name text, OUT result boolean ) AS $$ DECLARE _eva1 boolean; _eva2 boolean; BEGIN _eva1 := EXISTS(SELECT * FROM tableA AS A WHERE A.email = $1::citext); _eva2 := EXISTS(SELECT * FROM tableB AS A WHERE A.name::citext = $2::citext); result := _eva1 OR _eva2; END; $$ LANGUAGE plpgsql STRICT SECURITY DEFINER;
改造后对应的GraphQL调用就可以直接取result字段:
mutation MyMutation($email: String!, $name: String!) { itExists( input: { email: $email, name: $name } ) { result } }
你可以根据函数实际返回类型调整result的类型,不需要额外新增其他数据库对象,适配所有返回类型的函数改造。
方案2:使用PostGraphile智能注释(零侵入现有函数逻辑,最适合批量处理)
如果不想修改现有函数的代码,可以直接给函数添加PostGraphile识别的智能注释,指定返回字段名:
COMMENT ON FUNCTION it_exists(text, text) IS E'@resultFieldName result';
这个方案完全不需要改动现有函数的业务逻辑,不管函数返回的是布尔、数值、字符串还是其他自定义类型,只要加一行对应注释即可生效。批量处理时可以写脚本遍历所有需要调整的函数,批量生成并执行注释语句,改造成本极低。
方案3:自定义PostGraphile插件(全局统一规则,无需修改数据库侧内容)
如果你希望所有标量返回的函数都统一用result作为返回字段名,不需要逐个修改数据库侧的函数或注释,可以在PostGraphile服务侧开发自定义插件,修改默认的字段命名逻辑:
- 拦截
PgMutationPayload类型的字段生成逻辑 - 当检测到返回字段是标量类型、默认用类型名作为字段名时,统一替换为
result
这个方案适合函数量极大、不希望在数据库侧留存额外配置的场景。
内容的提问来源于stack exchange,提问作者Ουιλιαμ Αρκευα
相关产品推荐
相关产品推荐

