如何通过 simple_salesforce 拨打 Salesforce 批量 API 电话?

How can one make Salesforce Bulk API calls via simple_salesforce?

我正在使用模块 simple-salesforce,但我在文档中没有看到任何关于进行批量 API 调用的内容。有人知道怎么做吗?

https://github.com/simple-salesforce/simple-salesforce

几周前我运行遇到了同样的问题。遗憾的是,simple-salesforce 没有办法做到这一点。我通过源代码进行的研究似乎没有任何方法可以做到或破解它以使其工作。

我研究了许多其他 Python 基于批量 API 的工具。其中包括 Salesforce-bulk 1.0.7 (https://pypi.python.org/pypi/salesforce-bulk/1.0.7), Salesforce-bulkipy 1.0 (https://pypi.python.org/pypi/salesforce-bulkipy), and Salesforce_bulk_api (https://github.com/safarijv/salesforce-bulk-api).

我 运行 在我的系统上配置 Salesforce-bulk 1.0.7 和 Salesforce-bulkipy 1.0 时遇到一些问题,但 Salesforce_bulk_api 工作得很好。它使用 simple-salesforce 作为身份验证机制,但会处理批量作业的创建并为您上传记录。

请注意,simple-salesforce 和批量 API 的工作方式不同。 Simple-Salesforce 通过 REST 工作,因此您只创建 JSON 字符串——它们很容易与 Python 字典兼容。批量 APIs 使用上传到 Salesforce 的 CSV 文件。创建这些 CSV 可能有点危险,因为 header 中字段名称的顺序必须与文件中数据元素的顺序相对应。这不是什么大问题,但是在创建顺序匹配 header 和数据行之间的 CSV 行时,您需要更加小心。

The code does have some comments. There's also this readthedocs page 但是,即使这样看起来也需要一些帮助。

好东西在先,解释如下。

代码示例(假设您一次 运行 整个代码块):

from simple_salesforce import Salesforce

sf = Salesforce(<credentials>)

# query
accounts = sf.bulk.Account.query('SELECT Id, Name FROM Account LIMIT 5')
# returns a list of dictionaries similar to: [{'Name': 'Something totally new!!!', 'attributes': {'url': '/services/data/v38.0/sobjects/Account/object_id_1', 'type': 'Account'}, 'Id': 'object_id_1'}]

# assuming you've pulled data, modify it to use in the next statement
accounts[0]['Name'] = accounts[0]['Name'] + ' - Edited'
# update
result = sf.bulk.Account.update(accounts)
# result would look like [{'errors': [], 'success': True, 'created': False, 'id': 'object_id_1'}]

# insert
new_accounts = [{'Name': 'New Bulk Account - 1', 'BillingState': 'GA'}]
new_accounts = sf.bulk.Account.insert(new_accounts)
# new_accounts would look like [{'errors': [], 'success': True, 'created': True, 'id': 'object_id_2'}]

# upsert
accounts[0]['Name'] = accounts[0]['Name'].replace(' - Edited')
accounts.append({'Name': 'Bulk Test Account'})
# 'Id' is the column to "join" on. this uses the object's id column
upserted_accounts = sf.bulk.Account.upsert(accounts, 'Id')
# upserted_accounts would look like [{'errors': [], 'success': True, 'created': False, 'id': 'object_id_1'}, {'errors': [], 'success': True, 'created': True, 'id': 'object_id_3'}]

# how i assume hard_delete would work (i never managed to run hard_delete due to insufficient permissions in my org)
# get last element from the response.
# *NOTE* This ASSUMES the last element in the results of the upsert is the new Account.
#  This is a naive assumption
new_accounts.append(upserted_accounts[-1])
sf.bulk.Account.hard_delete(new_accounts)

使用 simple_salesforce,您可以通过

访问批量 api
<your Salesforce object>.bulk.<Name of the Object>.<operation to perform>(<appropriate parameter, based on your operation>)
  • <your Salesforce object> 是您从构造 simple_salesforce.Salesforce(<credentials>) 中得到的对象
    • <credentials> 是您的 usernamepasswordsecurity_tokensandbox(bool,如果您连接到沙箱)或 session_id。 (这是我知道的两种方式)
  • <Name of the Object> 只是 AccountOpportunity 或您试图操纵的任何对象
  • <operation to perform> 是以下之一:
    • 查询
    • 插入
    • 更新
    • 更新插入
    • hard_delete(我的帐户没有适当的权限来测试此操作。任何提及纯属猜测)
  • <appropriate parameter> 取决于您希望执行的操作
    • query - 包含 SOQL 的字符串
    • 插入 - 字典列表。记得在创建新记录时为您的组织要求的所有字段准备一个密钥
    • 更新 - 词典列表。你显然需要每个字典的有效对象 ID
    • upsert - 字典列表和表示 "external id" 列的字符串。 "external id" 可以是 Salesforce 对象 'Id' 或任何其他列;做出明智的选择。如果任何字典没有与 "external id" 相同的键,将创建一条新记录。
  • 返回什么:取决于操作。
    • 用您的结果查询 returns 词典列表。除了查询的列之外,每个字典都有一个 'attributes' 键。这包含一个 'url' 键,看起来它可以用于 api 对特定对象的请求,键和 'type' 键,这是返回的对象的类型
    • insert/update/upsert returns 字典列表。每本词典都像 {'errors': [], 'success': True, 'created': False, 'id': 'id of object would be here'}

感谢 @ATMA's question 展示了如何使用 query。有了这个问题和源代码,就能够找出 insertupdateupsert.