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

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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:12:34