Написав о том, “Как я создал скрипт Python для чтения электронной почты с сервера Exchange” и “Как я получаю доступ к Microsoft SharePoint в своих скриптах Python”, и получив отличные отзывы о статьях, я решил написать немного больше о доступе к данным бизнес-программного обеспечения из Python. На этот раз я покинул мир Microsoft и изучил комбинацию Salesforce и Python.
Технический стек
На этот раз мы создадим скрипт, который будет получать доступ к данным Salesforce из скрипта на языке Python (версия 3.7). Мы добьемся передачи данных через ODBC, используя модуль pyodbc (версия 4.0.26). Пожалуйста, обратите внимание, что мой скрипт использует Connect Bridge, коммерческий продукт, который заботится о соединении Python/Salesforce. С помощью Connect Bridge я собрал этот сценарий интеграции с небольшим количеством кода и небольшими усилиями. Более того, я сделал это таким образом, чтобы не испортить установку Salesforce (поверьте мне, это ОЧЕНЬ важно). Вы можете попробовать все это самостоятельно, получив бесплатную пробную версию Connect Bridge (подробнее см. Ниже). Connect Bridge – это промежуточное программное обеспечение, разработанное компанией Connecting Software. Он работает как интеграционная платформа. Вы можете написать свой код на Python или других языках программирования, и он позволяет подключать любое программное обеспечение через драйверы ODBC, драйверы JDBC или веб-службы. Вы можете использовать мост подключения для доступа не только к данным Salesforce, но и к данным
С чего мне начать?
Моя цель-получить данные Salesforce с помощью скрипта Python самым простым из возможных способов. Пожалуйста, имейте под рукой свои учетные данные для входа в систему Salesforce. Вам нужна учетная запись разработчика Salesforce/организация, и вам понадобится токен безопасности . Как только у вас все это будет, процедура проста:
- Запросите бесплатную пробную версию Connect Bridge , а затем установите Connect Bridge
- Установите Python для Windows версии 3.7+ и модуль pyodbc 4.0.26+
- Запустите Connect Bridge Management Studio. Оказавшись внутри: 3.1. Перейдите в раздел Учетные записи – Добавить учетную запись и добавьте учетную запись для Salesforce, используя учетные данные, которые я упомянул в начале этого раздела. 3.2. Откройте опцию Новый запрос, а затем Браузер соединений. Найдите соединитель Salesforce и разверните его, пока не увидите элемент с именем DefaultConnection. Щелкните его правой кнопкой мыши и выберите опцию Получить строку подключения. Скопируйте строку подключения ODBC. 3.3. Используйте опцию Новый запрос, чтобы протестировать запрос, который будет собирать нужные вам данные в Salesforce. Я покажу вам пример здесь, но это определенно то, что вы должны изменить. После того, как вы нажмете опцию “Новый запрос”, откройте браузер соединений. Найдите соединитель Salesforce и разверните его, пока не появится опция Таблицы. Мы видим, что схема содержит “таблицу” под названием Contact. Мы можем создать ваш запрос как ВЫБРАТЬ Приветствие, Имя, фамилию, Адрес электронной почты, Должность, Отдел ИЗ контактного ЛИМИТА 20; Это
Пусть начнутся сценарии
А теперь самое интересное! Давайте начнем писать сценарии. Все решение находится в одном файле скрипта CBSalesforce.py. Вы можете просмотреть полный исходный код ниже. Если вы сосредоточитесь на строках 58-85, вы увидите суть решения. Логика работы скрипта полностью описана ниже.
#!/usr/local/bin/python3.7 # encoding: utf-8 ''' CBSalesforce -- Execute Stored Procedure using Connect Bridge and the Salesforce connector @author: Ana Neto @copyright: 2020 @contact: ana@connecting-software.com @deffield updated: 06.01.2020 ''' import sys import os import pyodbc __all__ = [] __version__ = 0.3 __date__ = '2019-07-22' __updated__ = '2020-01-06' DEBUG = 1 TESTRUN = 0 PROFILE = 0 class CLIError(Exception): '''Generic exception to raise and log different fatal errors.''' def __init__(self, msg): super(CLIError).__init__(type(self)) self.msg = "E: %s" % msg def __str__(self): return self.msg def __unicode__(self): return self.msg def main(argv=None): # IGNORE:C0111 '''Command line options.''' program_name = os.path.basename(sys.argv[0]) program_version = "v%s" % __version__ program_build_date = str(__updated__) program_version_message = '%%(prog)s %s (%s)' % (program_version, program_build_date) program_shortdesc = __import__('__main__').__doc__.split("n")[1] program_license = '''%s Created by Ana Neto on %s. Licensed under the Apache License 2.0 http://www.apache.org/licenses/LICENSE-2.0 Distributed on an "AS IS" basis without warranties or conditions of any kind, either express or implied. USAGE ''' % (program_shortdesc, str(__date__)) try: query = "SELECT Salutation, FirstName, LastName, Email, Title, Department FROM Contact;" connstr = "Driver={Media Gateway ODBC Driver};impl='CORBA';host='CNSF-NB14.cns.local';port='8087';acc='SalesforceAna';uid='administrator';pwd='beatriz44';ssl='false'" '''COPY FROM CONNECT BRIDGE MANAGEMENT STUDIO''' conn = pyodbc.connect(connstr) cursor = conn.cursor() cursor.execute(query) while 1: row = None try: row = cursor.fetchone() except: print(sys.exc_info()[1]) break if not row: break print(row) except KeyboardInterrupt: ### handle keyboard interrupt ### return 0 except: print(sys.exc_info()[1]) #indent = len(program_name) * " " #sys.stderr.write(program_name + ": " + repr(e) + "n") #sys.stderr.write(indent + " for help use --help") return 2 if __name__ == "__main__": if TESTRUN: import doctest doctest.testmod() if PROFILE: import cProfile import pstats profile_filename = 'CBSalesforce_profile.txt' cProfile.run('main()', profile_filename) statsfile = open("profile_stats.txt", "wb") p = pstats.Stats(profile_filename, stream=statsfile) stats = p.strip_dirs().sort_stats('cumulative') stats.print_stats() statsfile.close() sys.exit(0) sys.exit(main())
Вот что делает скрипт: • Переменная connstr содержит строку подключения ODBC, которую я передаю в модуль pyodbc для создания соединения ODBC • Затем я использую это соединение ODBC (хранящееся в conn) для открытия курсора базы данных • Я выполняю запрос • Я выполняю цикл while для чтения результатов из курсора строка за строкой. Когда курсор.fetchone возвращает None, я прерываю цикл • Я также прерываю цикл, если во время выборки ODBC возникает исключение (проблема выводится на печать) • Если метод fetchone возвращает строку данных, я печатаю эти необработанные данные непосредственно на вывод. Пожалуйста, обратите внимание, что я мог бы отформатировать его как JSON, XML, CSV или любой другой формат, который может быть использован для обмена данными. Я также мог бы выбрать объект строки необработанных данных и выполнять пользовательские задачи в дальнейшем коде. Когда вы запускаете сценарий, не забывайте CBSalesforce.py скрипт имеет две переменные, которые необходимо изменить, подключить и запросить (строки 59 и 60). Вам нужно будет скопировать их из Connect Bridge Management Studio, как я уже объяснял
Ограничения
Клиентской библиотеки ODBC Linux не существует (и я даже не уверен, что она может быть). По этой причине использование средства Connect Bridge ограничено машинами Windows.
Вывод
Мы видели, как можно быстро получить доступ к данным Salesforce в Python с помощью платформы интеграции Connect Bridge. Вы также можете использовать тот же инструмент Connect Bridge для доступа к другому программному обеспечению Microsoft, такому как Dynamics или Exchange, или к различным видам программного обеспечения, таким как SAP или Gmail. Если у вас есть проблемы с интеграцией, Connect Bridge может быть полезным инструментом, который может избавить вас от многих головных болей. С его помощью вам нужно писать меньше кода, в вашем коде меньше ошибок, и как только это будет сделано, с вашей стороны не потребуется никакого обслуживания (Connect Bridge поставляется с гарантией прямой совместимости). Если вы хотите знать, можете ли вы использовать его для получения какой-то конкретной информации, которую вы хотите, попробуйте его с помощью бесплатной пробной версии или оставьте комментарий ниже, и я постараюсь вам помочь.