简单的 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 文件中。让我知道您是否需要额外的支持来根据您的情况调整代码。
我无法理解我的代码发生了什么:
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 文件中。让我知道您是否需要额外的支持来根据您的情况调整代码。