简单的 Salesforce query_more 永无止境

Simple Salesforce query_more never ending

我无法理解我的代码发生了什么:

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)

我遇到了两件事。首先是初始查询为下一个记录 url 提供 /services/data/v38.0/query/01gf000000gFYRwAAO-2000,但是接下来的查询给出 /services/data/v38.0/query/01gf000000gFYRwAAO-4000奇怪的是它正在改变块数量。

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

你注意到的...AAO-2000...AAO-4000是因为每个nextRecordsUrl都包含查询中获取下一个2000条记录批次的代码。所以 ...AAo-2000 获取记录 1-2000(第一个块),并且在 json 对象的末尾为您提供 url 以获取记录 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 文件中。让我知道您是否需要额外的支持来根据您的情况调整代码。