我在理解代码正在发生的事情时遇到了一些麻烦:
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。我的对象,所以我必须分块编写文件。如何使这段代码正常运行?
答案 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文件中。让我知道您是否需要其他支持,以使代码适应您的情况。