将Salesforce数据导入Python(使用simple-Salesforce或salesforce-bulk)

5
我正在尝试将Salesforce数据加载到Python dataframe中,以便我们可以在那里进行所有操作。 simple_salesforce适用,但有一个限制是我们达到了2,000个限制:
from simple_salesforce import Salesforce as s
eatpies = sf.query('Select Id from Case')
attrs = ['Id']
records = eatpies['records']

data = {}

for rec in records:
    for k in attrs:
        data.setdefault(k, []).append(rec[k])

dframe = pd.DataFrame(data)

print(dframe)

据说,salesforce-bulk(https://pypi.python.org/pypi/salesforce-bulk/1.0.7)可以绕过这个限制,但我无法进一步操作:
job = bulk.create_query_job("Case", contentType='CSV')
batch = bulk.query('select Id, type from Case')

TypeError                                 Traceback (most recent call last)
<ipython-input-13-076e14bf245d> in <module>()
----> 1 batch = bulk.query('select Id, type from Case')

TypeError: query() missing 1 required positional argument: 'soql'

请帮忙,谢谢!如果可以用Simple-Salesforce解决Salesforce的限制问题,那就太好了,但我在Google上找不到任何解决方案。

2个回答

6

更改这一行

eatpies = sf.query('Select Id from Case')

to the following:

eatpies = sf.query_all('Select Id from Case')

方法query_all是对query(...)query_more(...)的便利包装。

来自文档:

如果由于结果特别大,Salesforce在您的查询结果中添加了nextRecordsUrl,例如"nextRecordsUrl" :"/services/data/v26.0/query/01gD0000002HU6KIAW-2000",则您可以使用ID或完整URL(如果使用完整URL,则必须将'True'作为第二个参数传递)来获取其他结果。

sf.query_more("01gD0000002HU6KIAW-2000")
sf.query_more("/services/data/v26.0/query/01gD0000002HU6KIAW-2000", True)

你可以通过 simple-salesforce 访问批量 API。例如,替换:
eatpies = sf.query('Select Id from Case')
attrs = ['Id']
records = eatpies['records']

使用以下内容:
eatpies = sf.bulk.Case.query('Select Id from Case')
attrs = ['Id']
records = eatpies

关于使用批量API的更多信息:https://github.com/simple-salesforce/simple-salesforce#using-bulk


2
sf.query_all("select count(Id) from visitors where CreatedDate >= 2017-12-01T00:00:00.000+0000 and CreatedDate < 2019-01-01T00:00:00.000+0000", True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接