Простой Salesforce query_more никогда не заканчивается - PullRequest
0 голосов
/ 26 февраля 2019

У меня возникли проблемы с пониманием того, что происходит с моим кодом:

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, что странночто он меняет количество чанков.

Другая вещь, которая происходит, заключается в том, что следующий чанк никогда не заканчивается.В указанном объекте содержится около 95 тысяч строк, поэтому теоретически он должен выдавать около 25 файлов при 4000 или 48 файлов при 2000 году. Я не могу использовать Query_All из-за ограничений памяти в лямбда-выражении на AWS и размера некоторыхмои объекты, поэтому я должен писать файлы по частям.Как я могу заставить этот кусок кода функционировать должным образом?

1 Ответ

0 голосов
/ 01 марта 2019

От ...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.Затем вы можете объединить различные объекты json в скрипте python и экспортировать их в один файл json.Дайте мне знать, если вам нужна дополнительная поддержка в адаптации кода к вашей ситуации.

...