问询Hasura GraphQL查询中String数组转uuid数组的可行方案
可行解决方案
方案1:使用Hasura内置_cast操作符(优先推荐)
无需修改数据库字段定义、无需调整入参格式,仅修改GraphQL查询语句即可解决问题。核心逻辑是将数据库侧UUID类型的data_id字段转为字符串类型,和你传入的字符串数组完成匹配。
修改后的查询语句如下:
query GetDataByIds($dataIds: [String!]) { view_data(where: {data_id: {_cast: {String: {_in: $dataIds}}}}) { data_id created_on updated_on } }
你原本传入的字符串数组参数不需要做任何调整,查询执行时Hasura会自动完成类型转换逻辑。
如果希望将入参转为UUID类型再匹配,也可以用以下写法(仅当你能保证所有传入的字符串都是合法UUID格式时使用):
query GetDataByIds($dataIds: [String!]) { view_data(where: {_expr: {_in: ["data_id", {_cast: {$dataIds: "uuid[]"}}]}}) { data_id created_on updated_on } }
方案2:自定义SQL视图适配(兼容低版本Hasura)
如果你使用的Hasura版本低于v2.1.0不支持_cast操作符,可以在PostgreSQL中新增一个转换视图,提前把data_id字段转为字符串类型:
CREATE OR REPLACE VIEW view_data_with_str_id AS SELECT data_id::VARCHAR AS data_id_str, data_id, created_on, updated_on FROM view_data;
在Hasura控制台将这个视图暴露为GraphQL接口后,直接查询该视图用data_id_str字段做匹配即可,入参还是你原来的字符串数组。
注意事项
- 所有方案都要求你传入的字符串符合UUID格式规范,否则会出现匹配失败或执行报错
_cast操作符原生支持Hasura v2.1.0及以上版本,低版本建议优先升级后使用方案1
内容的提问来源于stack exchange,提问作者Fast Coderz
相关产品推荐
相关产品推荐

