Skapa en Python-konsolapp med Azure DocumentDB

Den här guiden vägleder dig genom att skapa ett Python-konsolprogram för att ansluta till ett Azure DocumentDB-kluster. Du konfigurerar utvecklingsmiljön, autentiserar azure.identity med hjälp av paketet från Azure SDK för Python och utför åtgärder som att skapa, fråga och uppdatera dokument.

Förutsättningar

  • En prenumeration på Azure

  • Ett befintligt Azure DocumentDB-kluster

  • Microsoft Entra-autentisering har konfigurerats för klustret och din identitet har tilldelats root roll.

  • Senaste versionen av Python.

Konfigurera konsolprogrammet

Skapa sedan ett nytt konsolprogramprojekt och importera de bibliotek som behövs för att autentisera till klustret.

  1. Skapa en ny katalog för projektet och konfigurera en virtuell miljö.

    mkdir mongodb-app
    cd mongodb-app
    python -m venv .venv
    
  2. Aktivera den virtuella miljön.

    # On Windows
    .venv\Scripts\activate
    
    # On macOS/Linux
    source .venv/bin/activate
    
  3. Skapa en ny Python-fil för ditt program.

    touch app.py
    
  4. Installera biblioteket azure.identity för Azure-autentisering.

    pip install azure.identity
    
  5. pymongo Installera drivrutinen för Python.

    pip install pymongo
    

Anslut till klustret

Använd nu Azure.Identity biblioteket för att få en TokenCredential som du kan använda för att ansluta till din kluster. Den officiella MongoDB-drivrutinen har ett särskilt gränssnitt som måste implementeras för att hämta token från Microsoft Entra för användning vid anslutning till klustret.

  1. Importera nödvändiga moduler överst i Python-filen.

    from azure.identity import DefaultAzureCredential
    from pymongo import MongoClient
    from pymongo.auth_oidc import OIDCCallback, OIDCCallbackContext, OIDCCallbackResult
    
  2. Skapa en anpassad klass som implementerar återanropsgränssnittet för MongoDB OpenID Connect (OIDC).

    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. Ange klusternamnvariabeln.

    clusterName = "<azure-documentdb-cluster-name>"
    
  4. Skapa en instans av DefaultAzureCredential och konfigurera autentiseringsegenskaperna.

    credential = DefaultAzureCredential()
    authProperties = {"OIDC_CALLBACK": AzureIdentityTokenCallback(credential)}
    
  5. Skapa en MongoDB-klient som konfigurerats med Microsoft Entra-autentisering.

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

Utföra vanliga åtgärder

Använd slutligen det officiella biblioteket för att utföra vanliga uppgifter med databaser, samlingar och dokument. Här använder du samma klasser och metoder som du skulle använda för att interagera med MongoDB eller DocumentDB för att hantera dina samlingar och objekt.

  1. Hämta en referens till databasen.

    database = client.get_database("<database-name>")
    
    print("Database pointer created")
    
  2. Hämta en referens till din samling.

    collection = database.get_collection("<container-name>")
    
    print("Collection pointer created")
    
  3. Skapa ett dokument och anslut det till samlingen med collection.update_one.

    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. Använd collection.find_one för att hämta ett visst dokument från samlingen.

    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. Fråga efter flera dokument med collection.find som matchar ett filter.

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