简单的Salesforce query_more永无止境

时间:2019-02-26 20:16:10

标签: python-3.6 simple-salesforce

我在理解代码正在发生的事情时遇到了一些麻烦:

import json
from simple_salesforce import Salesforce, SalesforceLogin

fileCount = 1
saveFilesPath ='<path>/'
fileName = saveFilesPath+'test_file'+str(fileCount)+'.json'
sf = Salesforce(username='<username>', password='<password>', security_token='<token>', domain='test' )

initialQuery = sf.query("SELECT id, name, createddate, lastmodifieddate FROM surveyquestionresponse__c")
nextChunk = initialQuery['nextRecordsUrl']
nextQuery = sf.query_more(nextChunk, True)

print(nextChunk)
print(nextQuery['nextRecordsUrl'])



#with open(fileName, 'w') as outfile :
#    json.dump(initialQuery['records'],outfile)

#while nextQuery['nextRecordsUrl'] is not None :
#    fileCount += 1
#    fileName = saveFilesPath+'test_file'+str(fileCount)+'.json'
#    print(nextQuery['nextRecordsUrl'])
#    with open(fileName, 'w') as outfile :
#        json.dump(nextQuery['records'], outfile)

与此有关的两件事正在发生。首先是初始查询为/services/data/v38.0/query/01gf000000gFYRwAAO-2000提供了下一个记录的url,但是nextQuery给了/services/data/v38.0/query/01gf000000gFYRwAAO-4000,这很奇怪它正在改变组块数量。

正在发生的另一件事是下一个块永远不会结束。列出的对象中大约有95K行,因此从理论上讲它应该吐出25个文件@ 4000或48个文件@2000。由于AWS上lambda中的内存限制以及某些内存的大小,我无法使用Query_All。我的对象,所以我必须分块编写文件。如何使这段代码正常运行?

1 个答案:

答案 0 :(得分:0)

您注意到的...AAO-2000...AAO-4000是因为每个nextRecordsUrl包含用于在查询中获取下一个2000条记录批处理的代码。因此...AAo-2000获取记录1-2000(第一个块),而json对象的末尾为您提供获取记录2001-4000(下一个块)的URL。网址中的...AAO-4000表示法表示了这一点。

我使用以下代码在自己的组织中遍历一系列查询,以捕获查询中的所有数据(总计〜62500条记录)。我没有遇到永无休止的分块问题。

# Initiate list for returned data
pulls = []

# Pull initial Query
initialQuery = sf.query("SELECT id, createddate, lastmodifieddate FROM Task")

# Append initial query data to pulls
pulls.append({'len':len(initialQuery['records']),'url':initialQuery['nextRecordsUrl']})

# Assign nextChunk with 'nextRecordsUrl' value and re-query with new parameters
nextChunk = initialQuery['nextRecordsUrl']
nextQuery = sf.query_more(nextChunk,True)

# Append nextQuery data to pulls
pulls.append({'len':len(nextQuery['records']),'url':nextQuery['nextRecordsUrl']})

# set up while loop to re-query salesforce until returned
# query does not have a 'nextRecordsUrl' return value
x = True
while x == True:
    try:
        # Query new 'nextREcordsUrl'
        nextQuery = sf.query_more(nextQuery['nextRecordsUrl'],True)

        # append new query to pulls
        pulls.append({'len':len(nextQuery['records']),'url':nextQuery['nextRecordsUrl']})
    except: # This triggers when nextQuery['nextRecordsUrl'] does not exist
        # Append final data to pulls
        pulls.append({'len':len(nextQuery['records']),'url':None}) 

        # set x to False to end loop
        x = False 

# return pulls to view data
pulls

这是概念验证代码,应进行一些修改才能应用于您的情况。我建议更改pulls.append({'len':len(nextQuery['records']),'url':None})以附加查询中需要的任何相关数据,或仅附加整个json对象。然后,您可以在python脚本中组合各种json对象,并将它们导出到单个json文件中。让我知道您是否需要其他支持,以使代码适应您的情况。