Ottenere dati SharePoint in script Python - un tutorial che utilizza Connect Bridge

Ottenere dati SharePoint in script Python - un tutorial che utilizza Connect Bridge

Ana Neto Connettori, Generale, Tecnico 1 Commento

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

Questo tutorial si occupa proprio di questo:
you will be able to do it in an easy way by using a tool called Connect Bridge."

Last updated: January, 10, 2022

Introduzione

Questo articolo descrive come fare Python si collega a SharePointcioè come accedere ai dati dei sistemi Microsoft SharePoint (2010, 2013 o 2019) da script in linguaggio Python (utilizzando la versione 3.7). Il trasferimento dei dati avviene tramite il livello ODBC. Abbiamo ottenuto questo risultato in Python utilizzando il file modulo pyodbc ver. 4.0.26.

E' importante notare che in questo articolo utilizziamo un prodotto commerciale chiamato Connect Bridge. Questo è, infatti, ciò che rende possibile l'integrazione Python / SharePoint, permettendo la comunicazione dei dati in modo che siate sicuri di non rovinare il lato SharePoint (e, credetemi, questo è MOLTO importante). È possibile ottenere una prova gratuita per Connect Bridge, in modo da poter provare tutto questo da soli.

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 Schema della forma
Connect Bridge architettura della piattaforma di integrazione

Come si può vedere nel diagramma dell'architettura, lo strumento può essere utilizzato per accedere non solo ai dati di Microsoft SharePoint all'interno del vostro script Python, ma si possono anche afferrare/immettere dati da/verso Microsoft Exchange e Microsoft Dynamics CRM tra molti altri.

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. Richiedi un prova gratuita e installare Connect Bridge
2. Installare Pitone per finestre ver. 3.7+. Please note that to make writing, running & debugging my script easier we have used Liclipse 5.2.4 con il plugin pydev, ma questo è, ovviamente, opzionale. È possibile utilizzare l'editor di vostra scelta.
3. Installare modulo pyodbc 4.0.26+
4. Eseguire Connect Bridge Management Studio e
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.

Mani sullo scripting!

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()) 

Ecco cosa sta facendo il nostro copione:

- Le linee 71-80 si concentrano sull'ottenere le variabili connstr e query dall'input degli argomenti della riga di comando. Per questo abbiamo usato il modello di script argparse di pydev per rendere la mia vita più facile
- La variabile connstr contiene la stringa di connessione ODBC che passiamo nel modulo pyodbc per creare una connessione ODBC (memorizzata nella variabile conn)
- come passo successivo apriamo un cursore di database utilizzando la connessione memorizzata in conn
- Avendo la connessione memorizzata in conn apriamo un cursore di database utilizzando conn
- Eseguiamo la query SQL (è la query che è stata passata attraverso il parametro della riga di comando denominato query)
- Infine, utilizziamo un while loop per leggere i risultati del cursore riga per riga. Quando il cursore.fetchone restituisce Nessuno, interrompiamo il ciclo
- Se si verifica un'eccezione durante il fetch ODBC, rompiamo anche il loop e stampiamo il problema in uscita
- Se il metodo fetchone ha successo e restituisce una riga di dati, stampiamo la riga di dati grezzi così com'è all'uscita. Questa è stata la nostra scelta per questa demo, ma si prega di notare che questo potrebbe essere qualsiasi tipo di output... potremmo formattare come xml o json, csv... o qualsiasi altro tipo di formato di scambio di dati. Potremmo anche semplicemente usare l'oggetto raw data row per essere in ulteriore codice per eseguire compiti personalizzati.

Esecuzione dello script CBQuery.py

Sappiamo che il nostro CBQuery.py accetta due argomenti a riga di comando posizionale: connstr e query.

Dobbiamo copiarli da Connect Bridge Management Studio come spiegato sopra (punto 4).

Possiamo creare una lista di contatti SharePoint e scrivere una voce?

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.

Ora dobbiamo chiamare la seguente query per aggiornare la riflessione dello schema Connect Bridge ODBC dello schema SharePoint. Così, la nostra nuova "tabella" diventa visibile al 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');

Ora dovreste essere in grado di vedere la nostra voce e la nostra nuova lista SharePoint nell'interfaccia utente 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

Possiamo inserire il documento eseguendo la seguente dichiarazione:

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;

Possiamo anche scaricare il contenuto binario di un particolare documento da una particolare biblioteca di documenti eseguendo la dichiarazione:

EXEC SP_SAVE_SHAREDDOCUMENT_BY_ID 'Documents', 2; 

A questo punto è possibile verificare l'esistenza del documento condiviso nell'interfaccia utente SharePoint

Vincoli

Finora, siamo stati in grado di utilizzare lo strumento Connect Bridge solo da sistemi operativi Windows, perché non è disponibile una libreria client ODBC Linux (e non siamo sicuri che sia possibile). Quindi assicuratevi di giocare con i vostri script Python su una macchina Windows.

Conclusione

Abbiamo visto come l'accesso ai dati SharePoint in Python può essere fatto facilmente utilizzando la piattaforma di integrazione Connect Bridge. Ora immaginate che quello che avete visto in questo articolo sia possibile anche con Microsoft Dynamics CRM e Microsoft Exchange! Sì, con Connect Bridge questo è possibile e il modo di farlo è simile.

A chi posso rivolgermi per domande?

Ana Neto

"Mi chiamo Ana Neto, e sono un consulente tecnico per Connecting Software. Sono un ingegnere del software dal 1997, e mi piace il mondo delle possibilità che connettono Bridge apre..

Se avete domande a riguardo, lasciate una risposta qui sotto!".

Commenti 1

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *