option

azure-cosmos-py

microsoft/skills microsoft/skills

Effectuez des opérations CRUD, exécutez des requêtes et gérez des conteneurs via l'API NoSQL d'Azure Cosmos DB à l'aide du SDK Python.

...Développer tout
12
Heure mise à jour 12 septembre 2026

SDK Azure Cosmos DB pour Python

Bibliothèque cliente pour l'API NoSQL d'Azure Cosmos DB — base de données multimodèle distribuée à l'échelle mondiale.

Installation

pip install azure-cosmos azure-identity

Variables d’environnement

COSMOS_ENDPOINT=https://.documents.azure.com:443/  # Requis pour toutes les méthodes d'authentification
COSMOS_DATABASE=mydb  # Requis pour toutes les méthodes d'authentification
COSMOS_CONTAINER=mycontainer  # Requis pour toutes les méthodes d'authentification
AZURE_TOKEN_CREDENTIALS=prod # Requis uniquement si DefaultAzureCredential est utilisé en production

Authentification et cycle de vie

🔑 Deux règles s’appliquent à tous les exemples de code ci-dessous :

  1. Privilégiez DefaultAzureCredential. Il fonctionne en local (Azure CLI / VS Code / Developer CLI) et dans Azure (identité gérée, identité de charge de travail) sans modification du code. Évitez les chaînes de connexion, les identifiants de compte et les clés API : ils contournent l’audit et la rotation Entra.
    • Développement local : DefaultAzureCredential fonctionne tel quel.
    • En production : définissez AZURE_TOKEN_CREDENTIALS=prod (ou AZURE_TOKEN_CREDENTIALS=) pour limiter la chaîne d’informations d’identification aux informations d’identification sécurisées pour la production.
  2. Enveloppez chaque client dans un gestionnaire de contexte afin que les transports HTTP, les sockets et les caches de jetons soient libérés de manière déterministe :
    • Synchrone : avec (...) comme client :
    • Asynchrone : async avec (...) comme client : et async avec DefaultAzureCredential() comme identifiant : (de azure.identity.aio)

Les extraits de code peuvent simplifier cette configuration, mais le code de production doit toujours respecter ces deux règles.

import os
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.cosmos import CosmosClient

# Développement local : DefaultAzureCredential. En production : définissez AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=
credential = DefaultAzureCredential(require_envvar=True)
# Ou utilisez directement des informations d’identification spécifiques en production :
# Voir https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()

endpoint = "https://.documents.azure.com:443/"

with CosmosClient(url=endpoint, credential=credential) as client:
    # Utilisez le client ici (voir les sections suivantes pour les opérations)
    ...

Hiérarchie des clients

Client Objectif Provenance
CosmosClient Opérations au niveau du compte Instanciation directe
DatabaseProxy Opérations sur la base de données client.get_database_client()
ContainerProxy Opérations sur le conteneur/les éléments database.get_container_client()

Flux de travail principal

Configuration de la base de données et du conteneur

# Récupérer ou créer la base de données
database = client.create_database_if_not_exists(id="mydb")

# Récupérer ou créer un conteneur avec une clé de partition
container = database.create_container_if_not_exists(
    id="mycontainer",
    partition_key=PartitionKey(path="/category")
)

# Récupérer les entités existantes
database = client.get_database_client("mydb")
container = database.get_container_client("mycontainer")

Créer un élément

item = {
    "id": "item-001",           # Obligatoire : unique au sein de la partition
    "category": "electronics",   # Valeur de la clé de partition
    "name": "Laptop",
    "price": 999,99,
    "tags": ["ordinateur", "portable"]
}

created = container.create_item(body=item)
print(f"Créé : {created['id']}")

Lecture d’un élément

# La lecture nécessite l'identifiant ET la clé de partition
item = container.read_item(
    item="item-001",
    partition_key="electronics"
)
print(f"Nom : {item['name']}")

Mise à jour d’un élément (remplacement)

item = container.read_item(item="item-001", partition_key="electronics")
item["price"] = 899,99
item["on_sale"] = True

updated = container.replace_item(item=item["id"], body=item)

Insérer ou mettre à jour un élément

# Créer si l’élément n’existe pas, remplacer s’il existe
item = {
    "id": "item-002",
    "category": "electronics",
    "name": "Tablette",
    "price": 499,99
}

result = container.upsert_item(body=item)

Supprimer un élément

container.delete_item(
    item="item-001",
    partition_key="electronics"
)

Requêtes

Requête de base

# Requête au sein d'une partition (efficace)
query = "SELECT * FROM c WHERE c.price < @max_price"
items = container.query_items(
    query=query,
    parameters=[{"name": "@max_price", "value": 500}],
    partition_key="electronics"
)

for item in items:
    print(f"{item['name']}: ${item['price']}")
</code></pre>
<h3>Requête inter-partitions</h3>
<pre><code class="language-python"># Inter-partitions (plus coûteux, à utiliser avec parcimonie)
query = "SELECT * FROM c WHERE c.price < @max_price"
items = container.query_items(
    query=query,
    parameters=[{"name": "@max_price", "value": 500}],
    enable_cross_partition_query=True
)

for item in items:
    print(item)
</code></pre>
<h3>Requête avec projection</h3>
<pre><code class="language-python">query = "SELECT c.id, c.name, c.price FROM c WHERE c.category = @category"
items = container.query_items(
    query=query,
    parameters=[{"name": "@category", "value": "electronics"}],
    partition_key="electronics"
)
</code></pre>
<h3>Lire tous les éléments</h3>
<pre><code class="language-python"># Lire tous les éléments d’une partition
items = container.read_all_items()  # Entre partitions
# Ou avec la clé de partition
items = container.query_items(
    query="SELECT * FROM c",
    partition_key="electronics"
)
</code></pre>
<h2>Clés de partition</h2>
<p><strong>Important</strong> : incluez toujours une clé de partition pour garantir l’efficacité des opérations.</p>
<pre><code class="language-python">from azure.cosmos import PartitionKey

# Clé de partition unique
container = database.create_container_if_not_exists(
    id="orders",
    partition_key=PartitionKey(path="/customer_id")
)

# Clé de partition hiérarchique (version préliminaire)
container = database.create_container_if_not_exists(
    id="events",
    partition_key=PartitionKey(path=["/tenant_id", "/user_id"])
)
</code></pre>
<h2>Débit</h2>
<pre><code class="language-python"># Créer un conteneur avec un débit provisionné
container = database.create_container_if_not_exists(
    id="mycontainer",
    partition_key=PartitionKey(path="/pk"),
    offer_throughput=400  # RU/s
)

# Lecture du débit actuel
offer = container.read_offer()
print(f"Débit : {offer.offer_throughput} RU/s")

# Mettre à jour le débit
container.replace_throughput(throughput=1000)
</code></pre>
<h2>Client asynchrone</h2>
<pre><code class="language-python">from azure.cosmos.aio import CosmosClient
from azure.identity.aio import DefaultAzureCredential

async def cosmos_operations():
    async with DefaultAzureCredential() as credential:
        async with CosmosClient(endpoint, credential=credential) as client:
            database = client.get_database_client("mydb")
            container = database.get_container_client("mycontainer")
            
            # Créer
            await container.create_item(body={"id": "1", "pk": "test"})
            
            # Lire
            item = await container.read_item(item="1", partition_key="test")
            
            # Requête
            async for item in container.query_items(
                query="SELECT * FROM c",
                partition_key="test"
            ):
                print(item)

import asyncio
asyncio.run(cosmos_operations())
</code></pre>
<h2>Gestion des erreurs</h2>
<pre><code class="language-python">from azure.cosmos.exceptions import CosmosHttpResponseError

try:
    item = container.read_item(item="nonexistent", partition_key="pk")
except CosmosHttpResponseError as e:
    if e.status_code == 404:
        print("Élément introuvable")
    elif e.status_code == 429:
        print(f"Limite de débit atteinte. Réessayer après : {e.headers.get('x-ms-retry-after-ms')} ms")
    else:
        raise
</code></pre>
<h2>Meilleures pratiques</h2>
<ol>
<li><strong>Optez pour le mode synchrone OU asynchrone et restez cohérent.</strong> Ne mélangez pas les clients synchrones <code>azure.cosmos</code> avec les clients asynchrones <code>azure.cosmos.aio</code> dans le même chemin d’appel. Choisissez un seul mode par module.</li>
<li><strong>Utilisez toujours des gestionnaires de contexte pour les clients et les informations d’identification asynchrones.</strong> Enveloppez chaque client dans <code>with CosmosClient(...) as client:</code> (synchrone) ou <code>async with CosmosClient(...) as client:</code> (asynchrone). Pour l’asynchrone <code>DefaultAzureCredential</code> de <code>azure.identity.aio</code>, utilisez également <code>async with credential:</code> afin que les jetons et les transports soient nettoyés.</li>
<li><strong>Utilisez <code>DefaultAzureCredential</code></strong> pour une authentification portable entre le développement local et Azure (évitez les chaînes de connexion / clés API dans la mesure du possible).</li>
<li><strong>Spécifiez toujours une clé de partition</strong> pour les lectures ponctuelles et les requêtes</li>
<li><strong>Utilisez des requêtes paramétrées</strong> pour prévenir les injections et améliorer la mise en cache</li>
<li><strong>Évitez les requêtes inter-partitions</strong> dans la mesure du possible</li>
<li><strong>Utilisez <code>upsert_item</code></strong> pour les écritures idempotentes</li>
<li><strong>Utilisez un client asynchrone</strong> pour les scénarios à haut débit</li>
<li><strong>Concevez la clé de partition</strong> pour une répartition homogène des données</li>
<li><strong>Utilisez <code>read_item</code></strong> plutôt qu’une requête pour la récupération d’un seul document</li>
</ol>
<h2>Fichiers de référence</h2>
<table>
<thead>
<tr>
<th>Fichier</th>
<th>Sommaire</th>
</tr>
</thead>
<tbody><tr>
<td>references/partitioning.md</td>
<td>Stratégies de clés de partition, clés hiérarchiques, détection et atténuation des partitions « chaudes »</td>
</tr>
<tr>
<td>references/query-patterns.md</td>
<td>Optimisation des requêtes, agrégations, pagination, transactions, flux de modifications</td>
</tr>
<tr>
<td>scripts/setup_cosmos_container.py</td>
<td>Outil CLI permettant de créer des conteneurs avec partitionnement, débit et indexation</td>
</tr>
</tbody></table>                                
Voir sur GitHub
---
name: azure-cosmos-py
description: Perform CRUD operations, run queries, and manage containers on Azure Cosmos DB NoSQL API using the Python SDK.
license: MIT
---

# Azure Cosmos DB SDK for Python

Client library for Azure Cosmos DB NoSQL API — globally distributed, multi-model database.

## Installation

```bash
pip install azure-cosmos azure-identity
```

## Environment Variables

```bash
COSMOS_ENDPOINT=https://<account>.documents.azure.com:443/  # Required for all auth methods
COSMOS_DATABASE=mydb  # Required for all auth methods
COSMOS_CONTAINER=mycontainer  # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```

## Authentication & Lifecycle

> **🔑 Two rules apply to every code sample below:**
>
> 1. **Prefer `DefaultAzureCredential`.** It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
>    - Local dev: `DefaultAzureCredential` works as-is.
>    - Production: set `AZURE_TOKEN_CREDENTIALS=prod` (or `AZURE_TOKEN_CREDENTIALS=<specific_credential>`) to constrain the credential chain to production-safe credentials.
> 2. **Wrap every client in a context manager** so HTTP transports, sockets, and token caches are released deterministically:
>    - Sync: `with <Client>(...) as client:`
>    - Async: `async with <Client>(...) as client:` **and** `async with DefaultAzureCredential() as credential:` (from `azure.identity.aio`)
>
> Snippets may abbreviate this setup, but production code should always follow both rules.

```python
import os
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.cosmos import CosmosClient

# Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Or use a specific credential directly in production:
# See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()

endpoint = "https://<account>.documents.azure.com:443/"

with CosmosClient(url=endpoint, credential=credential) as client:
    # Use client here (see following sections for operations)
    ...
```

## Client Hierarchy

| Client | Purpose | Get From |
|--------|---------|----------|
| `CosmosClient` | Account-level operations | Direct instantiation |
| `DatabaseProxy` | Database operations | `client.get_database_client()` |
| `ContainerProxy` | Container/item operations | `database.get_container_client()` |

## Core Workflow

### Setup Database and Container

```python
# Get or create database
database = client.create_database_if_not_exists(id="mydb")

# Get or create container with partition key
container = database.create_container_if_not_exists(
    id="mycontainer",
    partition_key=PartitionKey(path="/category")
)

# Get existing
database = client.get_database_client("mydb")
container = database.get_container_client("mycontainer")
```

### Create Item

```python
item = {
    "id": "item-001",           # Required: unique within partition
    "category": "electronics",   # Partition key value
    "name": "Laptop",
    "price": 999.99,
    "tags": ["computer", "portable"]
}

created = container.create_item(body=item)
print(f"Created: {created['id']}")
```

### Read Item

```python
# Read requires id AND partition key
item = container.read_item(
    item="item-001",
    partition_key="electronics"
)
print(f"Name: {item['name']}")
```

### Update Item (Replace)

```python
item = container.read_item(item="item-001", partition_key="electronics")
item["price"] = 899.99
item["on_sale"] = True

updated = container.replace_item(item=item["id"], body=item)
```

### Upsert Item

```python
# Create if not exists, replace if exists
item = {
    "id": "item-002",
    "category": "electronics",
    "name": "Tablet",
    "price": 499.99
}

result = container.upsert_item(body=item)
```

### Delete Item

```python
container.delete_item(
    item="item-001",
    partition_key="electronics"
)
```

## Queries

### Basic Query

```python
# Query within a partition (efficient)
query = "SELECT * FROM c WHERE c.price < @max_price"
items = container.query_items(
    query=query,
    parameters=[{"name": "@max_price", "value": 500}],
    partition_key="electronics"
)

for item in items:
    print(f"{item['name']}: ${item['price']}")
```

### Cross-Partition Query

```python
# Cross-partition (more expensive, use sparingly)
query = "SELECT * FROM c WHERE c.price < @max_price"
items = container.query_items(
    query=query,
    parameters=[{"name": "@max_price", "value": 500}],
    enable_cross_partition_query=True
)

for item in items:
    print(item)
```

### Query with Projection

```python
query = "SELECT c.id, c.name, c.price FROM c WHERE c.category = @category"
items = container.query_items(
    query=query,
    parameters=[{"name": "@category", "value": "electronics"}],
    partition_key="electronics"
)
```

### Read All Items

```python
# Read all in a partition
items = container.read_all_items()  # Cross-partition
# Or with partition key
items = container.query_items(
    query="SELECT * FROM c",
    partition_key="electronics"
)
```

## Partition Keys

**Critical**: Always include partition key for efficient operations.

```python
from azure.cosmos import PartitionKey

# Single partition key
container = database.create_container_if_not_exists(
    id="orders",
    partition_key=PartitionKey(path="/customer_id")
)

# Hierarchical partition key (preview)
container = database.create_container_if_not_exists(
    id="events",
    partition_key=PartitionKey(path=["/tenant_id", "/user_id"])
)
```

## Throughput

```python
# Create container with provisioned throughput
container = database.create_container_if_not_exists(
    id="mycontainer",
    partition_key=PartitionKey(path="/pk"),
    offer_throughput=400  # RU/s
)

# Read current throughput
offer = container.read_offer()
print(f"Throughput: {offer.offer_throughput} RU/s")

# Update throughput
container.replace_throughput(throughput=1000)
```

## Async Client

```python
from azure.cosmos.aio import CosmosClient
from azure.identity.aio import DefaultAzureCredential

async def cosmos_operations():
    async with DefaultAzureCredential() as credential:
        async with CosmosClient(endpoint, credential=credential) as client:
            database = client.get_database_client("mydb")
            container = database.get_container_client("mycontainer")
            
            # Create
            await container.create_item(body={"id": "1", "pk": "test"})
            
            # Read
            item = await container.read_item(item="1", partition_key="test")
            
            # Query
            async for item in container.query_items(
                query="SELECT * FROM c",
                partition_key="test"
            ):
                print(item)

import asyncio
asyncio.run(cosmos_operations())
```

## Error Handling

```python
from azure.cosmos.exceptions import CosmosHttpResponseError

try:
    item = container.read_item(item="nonexistent", partition_key="pk")
except CosmosHttpResponseError as e:
    if e.status_code == 404:
        print("Item not found")
    elif e.status_code == 429:
        print(f"Rate limited. Retry after: {e.headers.get('x-ms-retry-after-ms')}ms")
    else:
        raise
```

## Best Practices

1. **Pick sync OR async and stay consistent.** Do not mix `azure.cosmos` sync clients with `azure.cosmos.aio` async clients in the same call path. Choose one mode per module.
2. **Always use context managers for clients and async credentials.** Wrap every client in `with CosmosClient(...) as client:` (sync) or `async with CosmosClient(...) as client:` (async). For async `DefaultAzureCredential` from `azure.identity.aio`, also use `async with credential:` so tokens and transports are cleaned up.
3. **Use `DefaultAzureCredential`** for portable auth across local dev and Azure (avoid connection strings / API keys when possible).
4. **Always specify partition key** for point reads and queries
5. **Use parameterized queries** to prevent injection and improve caching
6. **Avoid cross-partition queries** when possible
7. **Use `upsert_item`** for idempotent writes
8. **Use async client** for high-throughput scenarios
9. **Design partition key** for even data distribution
10. **Use `read_item`** instead of query for single document retrieval

## Reference Files

| File | Contents |
|------|----------|
| [references/partitioning.md](references/partitioning.md) | Partition key strategies, hierarchical keys, hot partition detection and mitigation |
| [references/query-patterns.md](references/query-patterns.md) | Query optimization, aggregations, pagination, transactions, change feed |
| [scripts/setup_cosmos_container.py](scripts/setup_cosmos_container.py) | CLI tool for creating containers with partitioning, throughput, and indexing |

Tous les fichiers

0 fichiers

Installer azure-cosmos-py

Téléchargez et décompressez les fichiers de compétences dans votre répertoire .claude/skills/.

Télécharger le ZIP

Clonez le dépôt et copiez les fichiers de compétence dans votre projet.

git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-python/skills/azure-cosmos-py # Copy SKILL.md to your .claude/skills/ directory

Copier Copier
Configuration rapide: Copiez le dossier de la compétence dans .claude/skills/ Claude détectera automatiquement la compétence et l'utilisera

Compétences similaires

microservices-patterns
Heure mise à jour 29 juin 2026
jpa-patterns
Heure mise à jour 30 juin 2026
fabric-lakehouse
Heure mise à jour 30 juin 2026
prisma-expert
Heure mise à jour 29 juin 2026