Condividi tramite


Creare un'app console Python con Azure Cosmos DB per MongoDB vCore

Questa guida illustra come creare un'applicazione console Python per connettersi a un cluster vCore di Azure Cosmos DB per MongoDB. È possibile configurare l'ambiente di sviluppo, eseguire l'autenticazione usando il azure.identity pacchetto di Azure SDK per Python ed eseguire operazioni quali la creazione, l'esecuzione di query e l'aggiornamento dei documenti.

Prerequisiti

  • Un cluster esistente di Azure Cosmos DB per MongoDB (vCore).
  • Autenticazione di Microsoft Entra configurata per il cluster con il ruolo dbOwner assegnato alla tua identità.

  • Versione più recente di Python.

Configurare l'applicazione console

Creare quindi un nuovo progetto di applicazione console e importare le librerie necessarie per l'autenticazione nel cluster.

  1. Creare una nuova directory per il progetto e configurare un ambiente virtuale.

    mkdir cosmos-mongodb-app
    cd cosmos-mongodb-app
    python -m venv .venv
    
  2. Attivare l'ambiente virtuale.

    # On Windows
    .venv\Scripts\activate
    
    # On macOS/Linux
    source .venv/bin/activate
    
  3. Creare un nuovo file Python per l'applicazione.

    touch app.py
    
  4. Installare la azure.identity libreria per l'autenticazione di Azure.

    pip install azure.identity
    
  5. Installare il pymongo driver per Python.

    pip install pymongo
    

Connettersi al cluster

Ora, utilizza la libreria Azure.Identity per ottenere un TokenCredential da utilizzare per connetterti al cluster. Il driver Ufficiale di MongoDB ha un'interfaccia speciale che deve essere implementata per ottenere i token da Microsoft Entra per l'uso durante la connessione al cluster.

  1. Importare i moduli necessari nella parte superiore del file Python.

    from azure.identity import DefaultAzureCredential
    from pymongo import MongoClient
    from pymongo.auth_oidc import OIDCCallback, OIDCCallbackContext, OIDCCallbackResult
    
  2. Creare una classe personalizzata che implementa l'interfaccia di callback OIDC (OpenID Connect) di MongoDB.

    class AzureIdentityTokenCallback(OIDCCallback):
        def __init__(self, credential):
            self.credential = credential
    
        def fetch(self, context: OIDCCallbackContext) -> OIDCCallbackResult:
            token = self.credential.get_token(
                "https://ossrdbms-aad.database.windows.net/.default").token
            return OIDCCallbackResult(access_token=token)
    
  3. Impostare la variabile del nome del cluster.

    clusterName = "<azure-cosmos-db-mongodb-vcore-cluster-name>"
    
  4. Creare un'istanza di DefaultAzureCredential e configurare le proprietà di autenticazione.

    credential = DefaultAzureCredential()
    authProperties = {"OIDC_CALLBACK": AzureIdentityTokenCallback(credential)}
    
  5. Creare un client MongoDB configurato con l'autenticazione di Microsoft Entra.

    client = MongoClient(
        f"mongodb+srv://{clusterName}.global.mongocluster.cosmos.azure.com/",
        connectTimeoutMS=120000,
        tls=True,
        retryWrites=True,
        authMechanism="MONGODB-OIDC",
        authMechanismProperties=authProperties
    )
    
    print("Client created")
    

Eseguire operazioni comuni

Infine, usare la libreria ufficiale per eseguire attività comuni con database, raccolte e documenti. In questo caso si usano le stesse classi e metodi usati per interagire con MongoDB o DocumentDB per gestire le raccolte e gli elementi.

  1. Ottieni un riferimento al tuo database.

    database = client.get_database("<database-name>")
    
    print("Database pointer created")
    
  2. Ottieni un riferimento alla tua raccolta.

    collection = database.get_collection("<container-name>")
    
    print("Collection pointer created")
    
  3. Creare un documento e inserirlo o aggiornarlo nella raccolta con .

    new_document = {
        "_id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
        "category": "gear-surf-surfboards",
        "name": "Yamba Surfboard",
        "quantity": 12,
        "price": 850.00,
        "clearance": False,
    }
    
    filter = {
        "_id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
    }
    payload = {
        "$set": new_document
    }
    result = collection.update_one(filter, payload, upsert=True)
    
  4. Utilizzare collection.find_one per recuperare un documento specifico dalla raccolta.

    filter = {
        "_id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
        "category": "gear-surf-surfboards"
    }
    existing_document = collection.find_one(filter)
    print(f"Read document _id:\t{existing_document['_id']}")
    
  5. Eseguire una query per più documenti con collection.find che corrispondano a un filtro.

    filter = {
        "category": "gear-surf-surfboards"
    }
    matched_documents = collection.find(filter)
    
    for document in matched_documents:
        print(f"Found document:\t{document}")