opción

azure-cosmos-py

microsoft/skills microsoft/skills

Realiza operaciones CRUD, ejecuta consultas y gestiona contenedores en la API NoSQL de Azure Cosmos DB mediante el SDK de Python.

...Expandir todo
12
Tiempo actualizado 12 de septiembre de 2026

SDK de Azure Cosmos DB para Python

Biblioteca de cliente para la API NoSQL de Azure Cosmos DB: base de datos multimodelo distribuida a nivel mundial.

Instalación

pip install azure-cosmos azure-identity

Variables de entorno

COSMOS_ENDPOINT=https://.documents.azure.com:443/  # Obligatorio para todos los métodos de autenticación
COSMOS_DATABASE=mydb  # Obligatorio para todos los métodos de autenticación
COSMOS_CONTAINER=mycontainer  # Requerido para todos los métodos de autenticación
AZURE_TOKEN_CREDENTIALS=prod # Requerido solo si se utiliza DefaultAzureCredential en producción

Autenticación y ciclo de vida

🔑 Hay dos reglas que se aplican a todos los ejemplos de código que aparecen a continuación:

  1. Da prioridad a DefaultAzureCredential. Funciona tanto a nivel local (Azure CLI / VS Code / Developer CLI) como en Azure (identidad gestionada, identidad de carga de trabajo) sin necesidad de modificar el código. Evita las cadenas de conexión y las claves de cuenta o API, ya que eluden la auditoría y la rotación de Entra.
    • Desarrollo local: DefaultAzureCredential funciona tal cual.
    • Producción: establece AZURE_TOKEN_CREDENTIALS=prod (o AZURE_TOKEN_CREDENTIALS=) para limitar la cadena de credenciales a aquellas seguras para producción.
  2. Envuelve cada cliente en un gestor de contexto para que los transportes HTTP, los sockets y las cachés de tokens se liberen de forma determinista:
    • Sincrónico: con (...) como cliente:
    • Asíncrono: async con (...) como cliente: y async con DefaultAzureCredential() como credencial: (de azure.identity.aio)

Los fragmentos de código pueden abreviar esta configuración, pero el código de producción siempre debe seguir ambas reglas.

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

# Desarrollo local: DefaultAzureCredential. Producción: establece AZURE_TOKEN_CREDENTIALS=prod o AZURE_TOKEN_CREDENTIALS=
credential = DefaultAzureCredential(require_envvar=True)
# O bien, utiliza una credencial específica directamente en producción:
# Consulta 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:
    # Utiliza el cliente aquí (consulta las secciones siguientes para conocer las operaciones)
    ...

Jerarquía del cliente

Cliente Finalidad Obtener de
CosmosClient Operaciones a nivel de cuenta Instanciación directa
DatabaseProxy Operaciones con la base de datos client.get_database_client()
ContainerProxy Operaciones con contenedores/elementos base_de_datos.get_container_client()

Flujo de trabajo principal

Configuración de la base de datos y el contenedor

# Obtener o crear la base de datos
database = client.create_database_if_not_exists(id="mydb")

# Obtener o crear un contenedor con clave de partición
container = database.create_container_if_not_exists(
    id="mycontainer",
    partition_key=PartitionKey(path="/category")
)

# Obtener los ya existentes
base_de_datos = client.get_database_client("mydb")
contenedor = base_de_datos.get_container_client("mycontainer")

Crear elemento

item = {
    "id": "item-001",           # Obligatorio: único dentro de la partición
    "category": "electronics",   # Valor de la clave de partición
    "name": "Laptop",
    "price": 999.99,
    "tags": ["ordenador", "portátil"]
}

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

Leer elemento

# La lectura requiere el id Y la clave de partición
item = container.read_item(
    item="item-001",
    partition_key="electronics"
)
print(f"Nombre: {item['name']}")

Actualizar elemento (sustituir)

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)

Insertar o actualizar un elemento

# Crear si no existe, sustituir si existe
item = {
    "id": "item-002",
    "category": "electronics",
    "name": "Tablet",
    "price": 499.99
}

result = container.upsert_item(body=item)

Eliminar elemento

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

Consultas

Consulta básica

# Consulta dentro de una partición (eficiente)
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>Consulta entre particiones</h3>
<pre><code class="language-python"># Entre particiones (más costosa, utilízala con moderación)
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>Consulta con proyección</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>Leer todos los elementos</h3>
<pre><code class="language-python"># Leer todos los elementos de una partición
items = container.read_all_items()  # Entre particiones
# O con clave de partición
items = container.query_items(
    query="SELECT * FROM c",
    partition_key="electronics"
)
</code></pre>
<h2>Claves de partición</h2>
<p><strong>Importante</strong>: Incluye siempre la clave de partición para garantizar la eficiencia de las operaciones.</p>
<pre><code class="language-python">from azure.cosmos import PartitionKey

# Clave de partición única
container = database.create_container_if_not_exists(
    id="orders",
    partition_key=PartitionKey(path="/customer_id")
)

# Clave de partición jerárquica (versión preliminar)
container = database.create_container_if_not_exists(
    id="events",
    partition_key=PartitionKey(path=["/tenant_id", "/user_id"])
)
</code></pre>
<h2>Rendimiento</h2>
<pre><code class="language-python"># Crear un contenedor con un rendimiento predefinido
container = database.create_container_if_not_exists(
    id="mycontainer",
    partition_key=PartitionKey(path="/pk"),
    offer_throughput=400  # RU/s
)

# Leer el rendimiento actual
offer = container.read_offer()
print(f"Rendimiento: {offer.offer_throughput} RU/s")

# Actualizar el rendimiento
container.replace_throughput(throughput=1000)
</code></pre>
<h2>Cliente asíncrono</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")
            
            # Crear
            await container.create_item(body={"id": "1", "pk": "test"})
            
            # Leer
            item = await container.read_item(item="1", partition_key="test")
            
            # Consulta
            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>Gestión de errores</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("Elemento no encontrado")
    elif e.status_code == 429:
        print(f"Límite de solicitudes alcanzado. Reintentar después de: {e.headers.get('x-ms-retry-after-ms')} ms")
    else:
        raise
</code></pre>
<h2>Prácticas recomendadas</h2>
<ol>
<li><strong>Elige entre sincrónico O asíncrono y mantén la coherencia.</strong> No mezcles los clientes sincrónicos de <code>azure.cosmos</code> con los clientes asíncronos de <code>azure.cosmos.aio</code> en la misma ruta de llamada. Elige un modo por módulo.</li>
<li><strong>Utilice siempre gestores de contexto para los clientes y las credenciales asíncronas.</strong> Envuelva cada cliente en <code>with CosmosClient(...) as client:</code> (síncrono) o <code>async with CosmosClient(...) as client:</code> (asíncrono). Para el modo asíncrono <code>DefaultAzureCredential</code> de <code>azure.identity.aio</code>, utilice también <code>async with credential:</code> para que se eliminen los tokens y los transportes.</li>
<li><strong>Utiliza <code>DefaultAzureCredential</code></strong> para una autenticación portátil entre el entorno de desarrollo local y Azure (evita las cadenas de conexión y las claves de API siempre que sea posible).</li>
<li><strong>Especifica siempre la clave de partición</strong> para lecturas y consultas puntuales</li>
<li><strong>Utiliza consultas parametrizadas</strong> para evitar inyecciones y mejorar el almacenamiento en caché</li>
<li><strong>Evita las consultas entre particiones</strong> siempre que sea posible</li>
<li><strong>Utiliza <code>upsert_item</code></strong> para escrituras idempotentes</li>
<li><strong>Utilice un cliente asíncrono</strong> para escenarios de alto rendimiento</li>
<li><strong>Diseñe la clave de partición</strong> para una distribución uniforme de los datos</li>
<li><strong>Utilice <code>read_item</code></strong> en lugar de una consulta para la recuperación de un único documento</li>
</ol>
<h2>Archivos de referencia</h2>
<table>
<thead>
<tr>
<th>Archivo</th>
<th>Contenido</th>
</tr>
</thead>
<tbody><tr>
<td>references/partitioning.md</td>
<td>Estrategias de claves de partición, claves jerárquicas, detección y mitigación de particiones «calientes»</td>
</tr>
<tr>
<td>references/query-patterns.md</td>
<td>Optimización de consultas, agregaciones, paginación, transacciones y feed de cambios</td>
</tr>
<tr>
<td>scripts/setup_cosmos_container.py</td>
<td>Herramienta de línea de comandos para crear contenedores con partición, rendimiento e indexación</td>
</tr>
</tbody></table>                                
Ver en 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 |

Todos los archivos

0 archivos

Instalar azure-cosmos-py

Descarga y descomprime los archivos de habilidades en tu directorio .claude/skills/.

Descargar ZIP

Clona el repositorio y copia los archivos de la habilidad a tu proyecto.

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

Copiar Copiar
Configuración rápida: Copia la carpeta de la habilidad en .claude/skills/ Claude detectará y utilizará automáticamente la habilidad
Repositorio microsoft/skills

Habilidades relacionadas

microservices-patterns
Tiempo actualizado 29 de junio de 2026
jpa-patterns
Tiempo actualizado 30 de junio de 2026
fabric-lakehouse
Tiempo actualizado 30 de junio de 2026
prisma-expert
Tiempo actualizado 29 de junio de 2026