如何通过Simple_Salesforce快速删除Salesforce中的Contact记录
更快的批量删除Salesforce记录方案
你的问题核心是单条记录逐个删除带来的频繁网络请求开销——每次sf.Contact.delete(i)都会发起一次独立API调用,5000条记录就对应5000次请求,这是耗时的主要根源。以下是两种高效优化方案:
方案一:使用Simple-Salesforce的Bulk API批量删除
Simple-Salesforce原生支持Salesforce Bulk API,它能将多条删除请求打包成批次提交,大幅减少网络交互次数,速度能提升几十倍。
优化后的代码
from simple_salesforce import Salesforce from tqdm import tqdm username="#####" password="#####" security_token="######" domain="test" sf = Salesforce(username=username,password=password, security_token=security_token,domain=domain) #### QUERY #### results=sf.query_all(""" Select id FROM Contact where CreatedById='########' and RecordTypeId = '#######' """) # 直接提取ID列表,跳过不必要的DataFrame创建 record_ids = [rec['Id'] for rec in results['records']] # 使用Bulk API批量删除,批次大小设为Salesforce允许的最大值1000 if record_ids: # 跟踪批量任务进度 job = sf.bulk.Contact.delete(record_ids, batch_size=1000, use_serial=True) # 检查任务结果,定位删除失败的记录(可选) for batch in tqdm(job): if not batch['success']: print(f"删除失败的记录ID: {batch['id']},错误信息: {batch['errors']}") print('Contacts deleted')
关键优化点
- 省去DataFrame转换:直接从查询结果提取ID,减少内存占用和数据转换步骤
- 批量请求合并:5000条记录只需5次API请求,彻底降低网络延迟
- 可选错误处理:快速定位删除失败的记录,方便后续补操作
方案二:使用Salesforce REST Composite API(适合中小批量)
如果你的待删记录在200条以内,也可以用Composite API的集合删除操作,一次请求最多处理200条,适合快速处理中等规模任务。
示例代码
import json # 按200条为一组拆分ID列表 for i in range(0, len(record_ids), 200): batch_ids = record_ids[i:i+200] # 构造Composite请求体 composite_request = { "allOrNone": False, "compositeRequest": [ { "method": "DELETE", "url": f"/services/data/v59.0/sobjects/Contact/{record_id}", "referenceId": f"ref_{record_id}" } for record_id in batch_ids ] } # 发送批量删除请求 response = sf.restful('composite', method='POST', data=json.dumps(composite_request)) # 处理响应结果(可选) for result in response['compositeResponse']: if result['httpStatusCode'] != 204: print(f"删除失败ID: {result['referenceId'].split('_')[1]},错误: {result['body']}")
注意事项
- Composite API单请求最多支持200条操作,适合中小批量场景
allOrNone设为False时,部分记录删除失败不会影响其他记录的处理
额外建议
- 沙盒环境API速率限制比生产环境宽松,但也不要一次性提交过多批次,避免触发临时限流
- 若待删记录超过10万条,可分多个批次异步执行Bulk API任务
- 查询时只请求
Id字段即可,减少不必要的数据传输量
内容的提问来源于stack exchange,提问作者user15915737
相关产品推荐
相关产品推荐

