Python使用gql批量查询API结果输出列表/字典的函数排错
Python GQL批量查询位置信息代码修正
原代码问题点
- 缩进语法错误:Python以缩进区分代码块,原代码循环内的参数定义、请求执行部分缩进混乱,无法通过语法校验
- 全局变量使用不当:
global params无存在必要,单次请求的参数属于循环内的局部变量,全局变量易造成不同请求间的参数污染 - 返回逻辑错误:
return total.append(r)写法完全错误:append是列表的原地操作方法,返回值为None;且原逻辑仅会在循环结束后追加最后一次请求的结果,无法获取全量查询数据 - 参数名不匹配:单条查询示例中ID对应的参数字段为
id,原循环代码错误写为lineId,会直接导致接口参数校验失败 - 冗余操作:查询语句
gql(query)不需要在每次循环中重复编译,固定查询逻辑提前编译一次即可
修正后可运行代码
from gql import gql, Client from gql.transport.aiohttp import AIOHTTPTransport import pprint # 固定配置初始化,全局仅执行一次 API_URL = "替换为你的GQL接口地址" HEADERS = {"替换为你的接口鉴权头,比如Authorization": "对应token值"} transport = AIOHTTPTransport(url=API_URL, headers=HEADERS) client = Client(transport=transport) # 替换为你实际的GQL查询语句,注意变量名要和传入参数一一对应 QUERY_STR = """ query GetLocationData($id: ID!, $time: TimeRangeInput!) { # 此处填写你需要查询的字段,比如locationName、metricData等 } """ # 提前编译查询语句,避免循环内重复执行 compiled_query = gql(QUERY_STR) def batch_get_location_info(location_map: dict, time_start: str, time_end: str) -> list: """ 批量查询位置对应信息 :param location_map: 位置名到ID的映射字典,比如{"tokyo": "111", "rio": "112"} :param time_start: 查询开始时间,格式YYYY-MM-DD :param time_end: 查询结束时间,格式YYYY-MM-DD :return: 结构化的查询结果列表 """ result = [] for loc_name, loc_id in location_map.items(): # 构造当前位置对应的请求参数 req_params = { "id": loc_id, "time": {"from": time_start, "to": time_end} } # 执行请求 resp = client.execute(compiled_query, variable_values=req_params) # 结果中附带位置名称、ID,方便后续对应数据归属 result.append({ "location_name": loc_name, "location_id": loc_id, "info": resp }) return result if __name__ == "__main__": location_id_dict = {"tokyo": "111", "rio": "112", "LA": "113"} all_location_data = batch_get_location_info(location_id_dict, "2022-05-10", "2022-05-19") pprint.pprint(all_location_data)
额外优化建议
- 你当前使用的
AIOHTTPTransport是异步传输组件,当待查询的位置ID较多时,可以基于gql的异步执行能力做并发请求,相比顺序for循环等待上一个请求返回再发下一个,请求效率会提升数倍 - 不要使用全局列表存储查询结果,函数内部定义局部结果变量返回即可,避免多次调用函数时全局列表残留历史数据
- 所有和单次请求无关的固定逻辑(比如client初始化、查询语句编译)都放在循环/函数外执行,减少不必要的性能开销
内容的提问来源于stack exchange,提问作者Julia R.
相关产品推荐
相关产品推荐

