Пакетная загрузка Salesforce Bulk API с Python - PullRequest
2 голосов
/ 24 января 2020

У меня есть asyn c Python скрипт, который создает массовое задание / пакет API в Salesforce. После того, как пакет завершен, я загружаю файл CSV для обработки.

Вот моя проблема : Потоковая загрузка для файла CSV ~ 300 МБ с использованием Python может занять более 3 минут, используя этот асинхронный код:

Если вы знакомы с массовыми заданиями Salesforce, вы можете ввести свою информацию в указанные ниже переменные и загрузить результаты пакета для тестирования. Это рабочий пример кода при условии, что вы вводите необходимую информацию.

import asyncio, aiohttp, aiofiles
from simple_salesforce import Salesforce
from credentials import credentials as cred

sf_data_path = 'C:/Users/[USER NAME]/Desktop/'
job_id = '[18 DIGIT JOB ID]'
batch_id = '[18 DIGIT BATCH ID]'
result_id = '[18 DIGIT RESULT ID]'
instance_name = '[INSTANCE NAME]'
result_url = f'https://{instance_name}.salesforce.com/services/async/45.0/job/{job_id}/batch/{batch_id}/result/{result_id}'

sf = Salesforce(username=['SALESFORCE USERNAME'],
                password=['SALESFORCE PASSWORD'],
                security_token=['SALESFORCE SECURITY TOKEN'],
                organizationId=['SALESFORCE ORGANIZATION ID'])

async def download_results():
    err = None
    retries = 3
    status = 'Not Downloaded'
    for _ in range(retries):
        try:
            async with aiohttp.ClientSession() as session:
                async with session.get(url=result_url,
                                       headers={"X-SFDC-Session": sf.session_id, 'Content-Encoding': 'gzip'},
                                       timeout=300) as resp:
                    async with aiofiles.open(f'{sf_data_path}_DOWNLOAD_.csv', 'wb') as outfile:
                        while True:
                            chunk = await resp.content.read(10485760)  # = 10Mb
                            if not chunk:
                                break
                            await outfile.write(chunk)
                    status = 'Downloaded'
        except Exception as e:
            err = e
            retries -= 1
            status = 'Retrying'
            continue
        else:
            break
    else:
        status = 'Failed'
        return err, status, retries

asyncio.run(download_results())

Однако, если я загружаю результат пакета в Developer Workbench: https://workbench.developerforce.com/asyncStatus.php?jobId= «[18 DI GIT JOB ID]» тот же файл может загружаться через 5 секунд.

enter image description here

Очевидно, что здесь происходит что-то, что я пропускаю Я знаю, что Workbench использует PHP, эта функция доступна даже с Python? Я полагал, что вызовы asyn c сделают эту загрузку быстрой, но это не делает загрузку такой же быстрой, как функциональность в браузере. Есть идеи?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...