После положительного отзыва, который я получил за свою предыдущую статью “Как я создал скрипт Python для чтения электронных писем с сервера Exchange”, я решил написать немного больше о доступе к программному обеспечению Microsoft business с Python. Я думаю, что большинство разработчиков Python считают программное обеспечение Microsoft необходимым злом. Вот почему я придерживаюсь вселенной Microsoft и изучаю, как заставить Python подключаться к Microsoft SharePoint.
Технический стек
Мы увидим, как получить доступ к данным Microsoft SharePoint (версии 2010, 2013 или 2019) из скрипта на языке Python (я буду использовать версию 3.7). Передача данных будет осуществляться через уровень ODBC. Для этого в Python я буду использовать модуль pyodbc версии 4.0.26. Важно отметить, что мой сценарий использует коммерческий продукт под названием Connect Bridge, который делает возможной интеграцию Python/SharePoint. С Connect Bridge я сделал эту интеграцию с небольшим количеством трески и небольшими усилиями. И я сделал это таким образом, чтобы не испортить сторону SharePoint (поверьте мне, это ОЧЕНЬ важно). Вы можете попробовать все это самостоятельно, получив бесплатную пробную версию Connect Bridge. Connect Bridge-это интеграционная платформа, разработанная компанией Connecting Software, которая позволяет подключать любое программное обеспечение через драйверы ODBC, драйверы JDBC или веб-службы. Архитектура платформы представлена на этой схеме сценариев клиент-сервер.
Как видно на диаграмме, вы можете использовать этот инструмент для доступа не только к данным Microsoft SharePoint, но и ко многим другим программам. К ним относятся Microsoft Dynamics и Microsoft Exchange, и доступ может быть двунаправленным. Доступ к Microsoft Exchange из Python был именно тем, о чем я рассказывал в своей предыдущей статье.
Пусть начнутся сценарии
Теперь давайте приступим к части сценариев! Моя цель состоит в том, чтобы создать скрипт Python, который обращается к экземпляру SharePoint самым простым из возможных способов. Я предполагаю, что экземпляр SharePoint уже существует. Пожалуйста, имейте под рукой свои учетные данные для входа в SharePoint. Вот последовательность шагов, которые вам нужно выполнить:
- Запросите бесплатную пробную версию, а затем установите Connect Bridge
- Установите Python для Windows версия 3.7+ вместе с pyodbc модулем 4.0.26+
- Запустите Connect Bridge Management Studio и в нем: 4.1. Используя учетные данные, о которых я упоминал ранее, добавьте учетную запись для SharePoint ( Учетные записи – Добавить учетную запись ). 4.2. Откройте опцию Новый запрос , а затем Браузер подключений . Найдите соединитель SharePoint и разверните его, пока не увидите соединение По умолчанию . Щелкните его правой кнопкой мыши и выберите Получить строку подключения . Скопируйте строку подключения ODBC. Далее вы передадите его скрипту. 4.3. Используйте параметр Новый запрос для проверки запроса, который получит необходимые данные в SharePoint. Я приведу здесь пример запроса, но это то, что вы должны изменить. После того, как вы нажмете опцию Новый запрос , откройте Браузер соединений . Найдите соединитель SharePoint и откройте его, пока не увидите параметр Таблицы . Вы можете видеть, что схема содержит “таблицу” под названием Site_Pages. Мы можем создать ваш запрос как
SELECT UniqueId, ContentType, Created, Modified, ContentVersion FROM Site_Pages LIMIT 20;
Этот запрос выберет первые двадцать записей из списка Страниц сайта Sharepoint. Пожалуйста, обратите внимание, что похоже, что мы используем базу данных напрямую, но это не то, что происходит. Мост подключения-это доступ к API, а затем представление данных, как если бы это была база данных. Как только вы закончите писать свой запрос, скопируйте его, так как он вам также понадобится, чтобы передать его в скрипт.
Руки на сценарии!
Все решение находится в одном файле скрипта CBQuery.py. Вы можете просмотреть полный исходный код ниже. Если вы сосредоточитесь на строках 70-92, вы увидите суть решения. Полное описание того, как работает этот скрипт, приведено ниже.
#!/usr/local/bin/python3.7 # encoding: utf-8 ''' CBQuery -- query data from, write data to SharePoint CBQuery is a script that allows to run SQL queries via Connect Bridge ODBC driver @author: Ana Neto @copyright: 2019 @contact: ana@connecting-soiftware.com @deffield updated: 07.10.2019 ''' import sys import os import pyodbc from argparse import ArgumentParser from argparse import RawDescriptionHelpFormatter __all__ = [] __version__ = 0.2 __date__ = '2019-10-07' __updated__ = '2019-10-07' 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.''' if argv is None: argv = sys.argv else: sys.argv.extend(argv) 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: # Setup argument parser parser = ArgumentParser(description=program_license, formatter_class=RawDescriptionHelpFormatter) parser.add_argument('connstr') parser.add_argument('query') # Process arguments args = parser.parse_args() query = args.query connstr = args.connstr 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 = 'CBQuery_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())
Вот что делает скрипт: • Строки 71-80 используют шаблон скрипта argparse pydev для получения переменных connstr и запроса из входных аргументов командной строки. • Переменная connstr содержит строку подключения ODBC, которую я передаю в модуль pyodbc для построения соединения ODBC (хранится в переменной conn) • Затем я открываю курсор базы данных, используя соединение, хранящееся в conn • Я выполняю запрос (это SQL-запрос, который я получил с помощью параметра командной строки с именем query) • Я циклически использую цикл while для считывания результатов с курсора строка за строкой. Когда курсор.fetchone возвращает None, я прерываю цикл • Я также прерываю цикл, если во время выборки ODBC возникает исключение. В этом случае я также печатаю проблему для вывода. • Если метод fetchone завершается успешно и возвращает поток данных, я печатаю необработанные данные непосредственно на вывод. Обратите внимание, что это может быть любой тип вывода. Я мог бы отформатировать его как XML, JSON, CSV или любой другой формат обмена данными. Я также мог бы просто использовать
Можем ли мы создать список контактов SharePoint и написать запись?
Давайте теперь рассмотрим этот пример немного подробнее. Допустим, мы хотим создать список контактов в SharePoint и добавить контакт в этот список. Нам нужно следовать тому же процессу, но изменить запрос, чтобы использовать “Хранимую процедуру”. Опять же, эта “Хранимая процедура” не является истинной хранимой процедурой. На самом деле он будет получать доступ к SharePoint через API. Для этого мы должны выполнить запрос:
EXEC SP_CREATE_TABLE 'MyContacts', 'Created using the Connect Bridge platform', true, 'Contacts';
Запрос запускает новый список SharePoint “Мои контакты” с описанием, которое появится на панели быстрого запуска страницы SharePoint.
Чтобы завершить процедуру, нам необходимо выполнить следующий запрос для обновления отражения схемы ODBC моста подключения схемы SharePoint. Таким образом, наша новая “таблица” становится видимой клиенту ODBC.
EXEC SP_UPDATE_SCHEMA;
Теперь я могу вставить запись контакта в наш список контактов.
INSERT INTO MyContacts (FirstName, LastName) VALUES ('Ana', 'Neto');
Если вы перейдете в SharePoint, теперь вы сможете увидеть эту запись и наш новый список SharePoint.
Я могу выбрать только что созданную запись, выполнив следующий запрос
SELECT FirstName,LastName FROM MyContacts
Загрузка общего документа
Для загрузки общего документа я буду использовать существующий список SharePoint “Документы” и “Хранимая процедура” SP_INSERT_SHAREDDOCUMENT. Параметры, которые он принимает, следующие:
• данные
• имя файла
• папка на сервере (относительный путь)
• Тип MIME
• имя таблицы (для общих документов)
Мы можем вставить документ, выполнив следующую инструкцию:
EXEC SP_INSERT_SHAREDDOCUMENT 'Documents', 'myfile.txt', '/TestFolder/Documents', 'text/plain', 'YWJjZGVm';
Вы можете проверить наличие документа в таблице “Документы”, выполнив инструкцию:
SELECT Id,Name FROM Documents;
Ограничения
Клиентская библиотека ODBC Linux недоступна (и мы не уверены, возможно ли это вообще). По этой причине использование средства Connect Bridge ограничено машинами Windows.
Вывод
Мы видели, как доступ к данным SharePoint в Python можно быстро получить с помощью платформы интеграции Connect Bridge . Вы также можете использовать тот же инструмент Connect Bridge для доступа к другому программному обеспечению Microsoft, такому как Dynamics или Exchange, или другим видам программного обеспечения, таким как Salesforce или SAP. И если вы хотите использовать его в проекте на другом языке программирования, это тоже возможно. Например, чтобы получить данные SharePoint в коде Java с помощью Connect Bridge, вы можете проверить мою статью ” Использование Java для получения встреч и деловых документов в SharePoint “.