Obtenir des données SharePoint dans des scripts Python - un tutoriel utilisant Connect Bridge

Obtenir des données SharePoint dans des scripts Python - un tutoriel utilisant Connect Bridge

Ana Neto Connecteurs, Généralités, Technique 1 Commentaire

"Have you ever wondered how to access Microsoft SharePoint in your Python scripts?

C'est précisément ce à quoi répond ce tutoriel :
you will be able to do it in an easy way by using a tool called Connect Bridge."

Last updated: January, 10, 2022

Introduction

Cet article décrit comment faire Connexion Python à SharePointc'est-à-dire comment accéder aux données des systèmes Microsoft SharePoint (2010, 2013 ou 2019) à partir de scripts en langage Python (en utilisant la version 3.7). Les transferts de données sont effectués via la couche ODBC. Nous avons réalisé cela en Python en utilisant le module pyodbc ver. 4.0.26.

Il est important de noter que dans cet article, nous utilisons un produit commercial appelé Connect Bridge. C'est en fait ce qui rend possible l'intégration Python / SharePoint, en permettant la communication de données d'une manière qui vous assure de ne pas perturber le côté SharePoint (et, croyez-moi, c'est TRÈS important). Vous pouvez obtenir un essai gratuit pour le Connect Bridge, vous pouvez donc essayer tout cela par vous-même.

What is this "Connect Bridge"?

I'm glad you asked! Connect Bridge is a is an integration platform developed by Connecting Software that allows you to connect any software through ODBC drivers, JDBC drivers or Web Services. The general overview of the architecture of the tool is on this client-server scenario diagram.

Connect Bridge Schéma de la plateforme
Connect Bridge l'architecture de la plate-forme d'intégration

Comme vous pouvez le voir sur le diagramme d'architecture, l'outil peut être utilisé pour accéder non seulement aux données de Microsoft SharePoint à partir de votre script Python, mais vous pouvez également saisir/enregistrer des données de Microsoft Exchange et de Microsoft Dynamics CRM, parmi beaucoup d'autres.

The aim - getting SharePoint data using Python

The aim of our work was to create a Python script that would allow us to talk to SharePoint via Connect Bridge.

We use SharePoint, but it is possible to use similar logic to connect to Microsoft Exchange or to a CRM like Salesforce or Dynamics.

Getting started...

Now let's start this tutorial! Our goal is to create a simple Python script that accesses a SharePoint instance. We assume the SharePoint instance already exists (make sure you have your login credentials at hand). These are simple steps you need to follow:

1. Demander un essai gratuit et installer Connect Bridge
2. Installez Python pour Windows ver. 3.7+. Please note that to make writing, running & debugging my script easier we have used Liclipse 5.2.4 avec le plugin pydev, mais cela est bien sûr facultatif. Vous pouvez utiliser l'éditeur de votre choix.
3. Installez module pyodbc 4.0.26+
4. Exécution du studio de gestion Connect Bridge et
4.1. Add an account for SharePoint (Accounts - Add account). This is where you will need those credentials we mentioned earlier.
4.2. Open the New Query option and then the Connection Browser. Find the SharePoint Connector and open it until you see the DefaultConnection. Right-click on it and choose Get Connection string. Then copy the ODBC connection string. You will need it to pass it on to the script.
4.3. Use the New Query option to test out a query that will access what you need in SharePoint. We will do an example query here, but this is where you should put in what it is that you are looking for in SharePoint. Once you have clicked New Query, open the Connection Browser. Find the SharePoint Connector and open it until you see the Tables option. You'll see that the schema contains a “table” called Site_Pages so we can construct our query as

SELECT UniqueId, ContentType, Created, Modified, ContentVersion FROM Site_Pages LIMIT 10 ;

to select the first 10 entries from SharePoint's Site Pages list. It is important to note that although it looks as if we are using a database directly, that is not the case.

Connect Bridge is accessing the API and then presenting it as if it was a database. Once you have your query, copy it, as you will also need it to pass it on to the script.

Les mains sur le script !

The core and, at the same time, the only file in our solution is CBQuery.py. The full source code is below. Please focus on lines 70-92 which depict the core solution. A complete description of how this script works is below.

#!/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 and Michal Hainc 

  

@copyright:  2019 

  

@contact:    ana@connecting-soiftware.com 

@deffield    updated: 04.07.2019 

''' 

  

import sys 

import os 

import pyodbc 

  

from argparse import ArgumentParser 

from argparse import RawDescriptionHelpFormatter 

  

__all__ = [] 

__version__ = 0.2 

__date__ = '2019-07-04' 

__updated__ = '2019-07-04' 

  

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 and Michal Hainc 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()) 

Voici ce que fait notre scénario :

- Les lignes 71 à 80 se concentrent sur l'obtention des variables connstr et query à partir des arguments de la ligne de commande. Pour cela, nous avons utilisé le modèle de script argparse de Pydev pour me faciliter la vie
- La variable connstr contient la chaîne de connexion ODBC que l'on passe dans le module pyodbc pour créer une connexion ODBC (stockée dans la variable conn)
- l'étape suivante consiste à ouvrir un curseur dans la base de données en utilisant la connexion stockée dans conn
- La connexion étant stockée dans conn, nous ouvrons un curseur de base de données en utilisant conn
- Nous exécutons la requête SQL (c'est la requête qui a été passée via le paramètre de ligne de commande nommé query)
- Enfin, nous utilisons une boucle de temps pour lire les résultats du curseur ligne par ligne. Lorsque cursor.fetchone renvoie None, nous interrompons la boucle
- Si une exception se produit lors de la recherche ODBC, nous interrompons également la boucle et imprimons le problème en sortie
- Si la méthode fetchone réussit et renvoie une ligne de données, nous imprimons la ligne de données brutes telle qu'elle est à la sortie. C'était notre choix pour cette démo, mais veuillez noter que cela peut être n'importe quel type de sortie... nous pouvons formater en xml ou json, csv... ou tout autre type de format d'échange de données. Nous pourrions aussi simplement utiliser l'objet row de données brutes pour être dans un code supplémentaire afin d'effectuer des tâches personnalisées.

Exécution du script CBQuery.py

Nous savons que notre CBQuery.py accepte deux arguments de ligne de commande positionnelle : connstr et query.

Nous devons les copier à partir de Connect Bridge Management Studio comme expliqué ci-dessus (point 4).

Pouvons-nous créer une liste de contacts SharePoint et rédiger une entrée ?

Let’s now suppose we want to create a contact list in SharePoint and create a contact on that list. We basically need to follow the same process but change the query to use a "Stored Procedure". Again this "Stored Procedure" will, in fact, be accessing SharePoint via the API, but it is getting the data into the SharePoint you specified. Here is the query that we need to run:

EXEC SP_CREATE_TABLE 'MyContacts', 'This table was created using Connect Bridge', true, 'Contacts';

The query creates a new SharePoint list (MyContacts), with a description that will show in the quick launch bar of the SharePoint page.

Nous devons maintenant appeler la requête suivante pour mettre à jour le schéma ODBC Connect Bridge qui reflète le schéma SharePoint. Ainsi, notre nouvelle "table" devient visible pour le client ODBC.

EXEC SP_UPDATE_SCHEMA;

We can insert a contact entry into our contact list at this point.

INSERT INTO MyContacts (FirstName, LastName) VALUES ('Ana', 'Neto');

Vous devriez maintenant pouvoir voir notre entrée et notre nouvelle liste SharePoint dans l'interface utilisateur SharePoint.

We can select the entry we just created by running the following query.

SELECT FirstName,LastName FROM MyContacts

Uploading & downloading of shared documents

For uploading a shared document, we will use the existing SharePoint list “Documents” and the "Stored Procedure" SP_INSERT_SHAREDDOCUMENT. The parameters it takes are:

• Shared documents table name

• Filename

• Folder (relative path, on the server)

• MIME type

• Data for the file

Nous pouvons insérer le document en faisant la déclaration suivante :

EXEC SP_INSERT_SHAREDDOCUMENT
    'Documents',
    'hello2.txt',
    '/Shared Documents/NewFolder',
    'text/plain',
    'SGVsbG8gV29ybGQ=';

If you want to check the presence of the folder beforehand, you can run the statement:

EXEC SP_ENSURE_FOLDER_PATH
    'Documents', 
    '/NewFolder';

After running the SP_INSERT_SHAREDDOCUMENT we can check the presence of the document in the “Documents” table by running the statement:

SELECT Id,Name FROM Documents;

Nous pouvons également télécharger le contant binaire d'un document particulier à partir d'une bibliothèque de documents particulière en lançant la déclaration :

EXEC SP_SAVE_SHAREDDOCUMENT_BY_ID 'Documents', 2; 

A ce stade, vous pouvez vérifier l'existence du document partagé dans l'interface utilisateur SharePoint

Contraintes

Jusqu'à présent, nous n'avons pu utiliser l'outil Connect Bridge qu'à partir des systèmes d'exploitation Windows, car aucune bibliothèque client ODBC Linux n'est disponible (et nous ne sommes même pas sûrs que cela soit possible). Assurez-vous donc de jouer avec vos scripts Python sur une machine Windows.

Conclusion

Nous avons vu comment l'accès aux données SharePoint en Python peut être facilement réalisé en utilisant la plate-forme d'intégration Connect Bridge. Maintenant, imaginez que ce que vous avez vu dans cet article est également possible avec Microsoft Dynamics CRM et Microsoft Exchange ! Oui, avec Connect Bridge, c'est possible et la manière de le faire est similaire.

À qui puis-je m'adresser pour toute question ?

Ana Neto

"Mon nom est Ana Neto, et je suis conseiller technique pour Connecting Software. Je suis ingénieur en logiciel depuis 1997, et j'adore le monde des possibilités qu'ouvre le pont de connexion.

Si vous avez des questions à ce sujet, veuillez laisser une réponse ci-dessous".

Commentaires 1

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *