Python调用Airtable API无法获取全部超100条记录问题排查
问题排查:Airtable API无法获取全部记录的原因及修复
核心问题分析
你的get_all_advances函数无法拉取全量记录,根源在两点:
- 未做记录累加:每次循环只处理当前请求返回的
records,完全没把之前批次的记录存下来,最后只会返回某一批次的记录,不是全部。 - 冗余的JSON操作:
json.loads(json.dumps(rsp))纯粹多余,get_all和get_all_w_offset已经返回了解析好的字典,重复序列化反序列化毫无意义。
修复后的完整代码
def get_all_advances(): # 初始化总记录列表 all_records = [] # 第一次请求,不带offset rsp = get_all(REGISTRE_TBL) # 把第一批记录加入总列表 all_records.extend(rsp.get("records", [])) # 获取offset,用于后续请求 offset = rsp.get("offset") # 循环拉取剩余数据,直到没有offset while offset: rsp = get_all_w_offset(REGISTRE_TBL, offset) all_records.extend(rsp.get("records", [])) # 更新offset,如果没有则退出循环 offset = rsp.get("offset") return all_records
修复细节说明
- 新增
all_records列表专门存储所有批次的记录,每次请求后用extend把新记录追加进去,确保不丢失之前的数据。 - 删掉了完全没必要的JSON序列化反序列化步骤,直接用接口返回的字典即可。
- 调整了循环逻辑:先处理第一次请求的记录,再根据offset循环拉取剩余数据,保证所有记录都被收集。
额外优化建议
可以把两个请求函数合并成一个,减少代码重复:
def get_airtable_records(table, offset=None): url = f"{endpoint}/{table}" params = {"offset": offset} if offset else {} r = requests.get(url=url, headers=headers, params=params) return r.json()
之后get_all_advances可以简化成更简洁的版本:
def get_all_advances(): all_records = [] offset = None while True: rsp = get_airtable_records(REGISTRE_TBL, offset) all_records.extend(rsp.get("records", [])) offset = rsp.get("offset") if not offset: break return all_records
内容的提问来源于stack exchange,提问作者Kaiss B.
相关产品推荐
相关产品推荐

