使用Python批量读取Salesforce数据时出现数据缺失问题
问题原因
返回数据不全由Salesforce Bulk API的默认分页限制导致,具体根因如下:
- Salesforce Bulk API v1(你使用的v47.0版本属于该范畴)单次查询默认最多返回10000条记录,超出限制的结果会生成queryLocator标识,需要分页拉取后续批次。缩小时间范围后总记录数低于1万,因此可以一次性返回全部结果,完全匹配观测到的现象。
- 自定义修改的bulk.py文件可能丢失了simple-salesforce原生自带的自动分页拉取逻辑,仅返回了第一页的查询结果。
- 查询字段包含IsDeleted,Bulk API默认不会返回已软删除的记录,需要额外开启参数才能拉取到这类数据。
解决步骤
- 验证总记录数
先执行统计查询确认该时间范围内的总记录数,确认是否存在返回结果数少于总记录数的情况:
select count() from Account WHERE ModifiedDate >= 2021-06-17T23:10:00+00:00 AND ModifiedDate < 2021-06-21T23:15:00+00:00
如果统计结果和实际拿到的结果数不一致,即可确认是分页导致的丢数。
- 补充分页拉取逻辑
调整查询代码,开启全量拉取配置,示例如下:
bulk_query = 'select Id,IsDeleted from Account WHERE ModifiedDate >= 2021-06-17T23:10:00+00:00 AND ModifiedDate < 2021-06-21T23:15:00+00:00' # 开启已删除记录包含、指定批量大小,自动拉取全量结果 query_results = sf_conn.bulk.__getattr__(sf_object).query( bulk_query, include_deleted=True, batch_size=10000 ) # 若修改后的bulk.py不支持自动分页,可手动遍历所有批次拉取 all_records = [] lazy_query = sf_conn.bulk.__getattr__(sf_object).query(bulk_query, include_deleted=True, lazy_operation=True) for batch in lazy_query: all_records.extend(batch) query_results = all_records
- 拆分查询批次(备选)
如果单次查询时间范围过大触发Bulk API超时限制,可将时间范围拆分为更小的粒度(例如按天/按小时拆分),依次查询每个时间窗口的结果后合并,避免单次查询扫描记录过多提前返回截断结果。
内容的提问来源于stack exchange,提问作者sr1991
相关产品推荐
相关产品推荐

