옵션

azure-cosmos-py

microsoft/skills microsoft/skills

Python SDK를 사용하여 Azure Cosmos DB NoSQL API에서 CRUD 작업을 수행하고, 쿼리를 실행하며, 컨테이너를 관리할 수 있습니다.

...모든 것을 확장하십시오
12
업데이트 된 시간 2026년 9월 12일

Python용 Azure Cosmos DB SDK

Azure Cosmos DB NoSQL API용 클라이언트 라이브러리 — 전 세계적으로 분산된 다중 모델 데이터베이스.

설치

pip install azure-cosmos azure-identity

환경 변수

COSMOS_ENDPOINT=https://.documents.azure.com:443/  # 모든 인증 방법에 필수
COSMOS_DATABASE=mydb  # 모든 인증 방법에 필수
COSMOS_CONTAINER=mycontainer  # 모든 인증 방식에 필수
AZURE_TOKEN_CREDENTIALS=prod # 프로덕션 환경에서 DefaultAzureCredential을 사용하는 경우에만 필수

인증 및 수명 주기

🔑 아래의 모든 코드 예제에는 다음 두 가지 규칙이 적용됩니다:

  1. DefaultAzureCredential을 우선적으로 사용하십시오. 코드 변경 없이 로컬(Azure CLI / VS Code / Developer CLI) 및 Azure(관리형 ID, 워크로드 ID)에서 모두 작동합니다. 연결 문자열, 계정/API 키는 사용하지 마십시오. 이러한 항목은 Entra 감사 및 키 회전을 우회합니다.
    • 로컬 개발: DefaultAzureCredential은 별도 설정 없이 바로 작동합니다.
    • 프로덕션: AZURE_TOKEN_CREDENTIALS=prod (또는 AZURE_TOKEN_CREDENTIALS=)를 설정하여 자격 증명 체인을 프로덕션 환경에서 안전한 자격 증명만 사용하도록 제한하십시오.
  2. 모든 클라이언트를 컨텍스트 매니저로 감싸서 HTTP 전송, 소켓 및 토큰 캐시가 결정론적으로 해제되도록 하십시오:
    • 동기식: (...) as client:
    • 비동기: (...)을 클라이언트로 사용하는 async DefaultAzureCredential()을 자격 증명으로 사용하는 async: ( azure.identity.aio에서 제공)

코드 예제에서는 이 설정을 생략할 수 있지만, 실제 운영 코드에서는 항상 두 규칙을 모두 따라야 합니다.

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

# 로컬 개발 환경: DefaultAzureCredential. 프로덕션 환경: AZURE_TOKEN_CREDENTIALS=prod 또는 AZURE_TOKEN_CREDENTIALS=설정 
credential = DefaultAzureCredential(require_envvar=True)
# 또는 프로덕션 환경에서 특정 자격 증명을 직접 사용할 수 있습니다:
# 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:
    # 여기서 클라이언트를 사용합니다(작업에 대해서는 다음 섹션을 참조하세요).
    ...

클라이언트 계층 구조

클라이언트 목적 출처
CosmosClient 계정 수준 작업 직접 인스턴스화
DatabaseProxy 데이터베이스 작업 client.get_database_client()
컨테이너 프록시 컨테이너/항목 작업 database.get_container_client()

핵심 워크플로우

데이터베이스 및 컨테이너 설정

# 데이터베이스 가져오기 또는 생성
database = client.create_database_if_not_exists(id="mydb")

# 파티션 키를 사용하여 컨테이너 가져오기 또는 생성
container = database.create_container_if_not_exists(
    id="mycontainer",
    partition_key=PartitionKey(path="/category")
)

# 기존 데이터베이스 및 컨테이너 가져오기
database = client.get_database_client("mydb")
container = database.get_container_client("mycontainer")

항목 생성

item = {
    "id": "item-001",           # 필수: 파티션 내에서 고유해야 함
    "category": "electronics",   # 파티션 키 값
    "name": "Laptop",
    "price": 999.99,
    "tags": ["computer", "portable"]
}

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

항목 읽기

# 읽기 시 id와 파티션 키가 모두 필요합니다
item = container.read_item(
    item="item-001",
    partition_key="electronics"
)
print(f"이름: {item['name']}")

항목 업데이트 (덮어쓰기)

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)

항목 삽입/업데이트

# 존재하지 않으면 생성하고, 존재하면 덮어쓰기
item = {
    "id": "item-002",
    "category": "electronics",
    "name": "Tablet",
    "price": 499.99
}

result = container.upsert_item(body=item)

항목 삭제

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

쿼리

기본 쿼리

# 파티션 내 쿼리 (효율적)
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>
</code></pre>
<h3>파티션 간 쿼리</h3>
<pre><code class="language-python"># 파티션 간 쿼리 (성능 저하가 크므로 신중하게 사용)
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>투영을 포함한 쿼리</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>모든 항목 읽기</h3>
<pre><code class="language-python"># 파티션 내 모든 항목 읽기
items = container.read_all_items()  # 파티션 간
# 또는 파티션 키를 사용하여
items = container.query_items(
    query="SELECT * FROM c",
    partition_key="electronics"
)
</code></pre>
<h2>파티션 키</h2>
<p><strong>중요</strong>: 효율적인 작업을 위해 항상 파티션 키를 포함하십시오.</p>
<pre><code class="language-python">from azure.cosmos import PartitionKey

# 단일 파티션 키
container = database.create_container_if_not_exists(
    id="orders",
    partition_key=PartitionKey(path="/customer_id")
)

# 계층적 파티션 키 (프리뷰)
container = database.create_container_if_not_exists(
    id="events",
    partition_key=PartitionKey(path=["/tenant_id", "/user_id"])
)
</code></pre>
<h2>처리량</h2>
<pre><code class="language-python"># 할당된 처리량을 가진 컨테이너 생성
container = database.create_container_if_not_exists(
    id="mycontainer",
    partition_key=PartitionKey(path="/pk"),
    offer_throughput=400  # RU/s
)

# 현재 처리량 읽기
offer = container.read_offer()
print(f"처리량: {offer.offer_throughput} RU/s")

# 처리량 업데이트
container.replace_throughput(throughput=1000)
</code></pre>
<h2>비동기 클라이언트</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")
            
            # 생성
            await container.create_item(body={"id": "1", "pk": "test"})
            
            # 읽기
            item = await container.read_item(item="1", partition_key="test")
            
            # 쿼리
            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>오류 처리</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("항목을 찾을 수 없음")
    elif e.status_code == 429:
        print(f"요율 제한. {e.headers.get('x-ms-retry-after-ms')}ms 후에 다시 시도하십시오")
    else:
        raise
</code></pre>
<h2>모범 사례</h2>
<ol>
<li><strong>동기식 또는 비동기식 중 하나를 선택하고 일관성을 유지하세요.</strong> 동일한 호출 경로에서 <code>azure.cosmos</code> 동기식 클라이언트와 <code>azure.cosmos.aio</code> 비동기식 클라이언트를 혼합하지 마세요. 모듈당 하나의 모드를 선택하세요.</li>
<li><strong>클라이언트 및 비동기 자격 증명에는 항상 컨텍스트 관리자를 사용하십시오.</strong> 모든 클라이언트를 <code>with CosmosClient(...) as client:</code> (동기) 또는 <code>async with CosmosClient(...) as client:</code> (비동기)로 감싸십시오. <code>azure.identity.aio</code>의 비동기 <code>DefaultAzureCredential</code>을 사용할 경우에도, 토큰과 전송 경로가 정리되도록 <code>async with credential:</code>을 함께 사용하십시오.</li>
<li><strong>로컬 개발 환경과 Azure 간에 이식 가능한 인증을 위해 <code>DefaultAzureCredential</code></strong>을 사용하십시오(가능한 경우 연결 문자열/API 키 사용을 피하십시오).</li>
<li><strong>특정 항목 읽기 및 쿼리 시 항상 파티션 키</strong>를 명시하십시오.</li>
<li><strong>인젝션을 방지하고 캐싱 성능을 향상시키려면 매개변수화된 쿼리</strong>를 사용하십시오.</li>
<li><strong>가능한 경우 파티션 간 쿼리</strong>는 피하십시오.</li>
<li><strong>이멱포텐트 쓰기를 위해 <code>upsert_item</code></strong>를 사용하십시오.</li>
<li><strong>높은 처리량이 필요한 시나리오에서는 비동기 클라이언트</strong>를 사용하십시오.</li>
<li><strong>데이터가 균등하게 분산되도록 파티션 키</strong>를 설계하십시오.</li>
<li><strong>단일 문서 검색 시 쿼리 대신 <code>read_item</code></strong>을 사용하십시오.</li>
</ol>
<h2>참조 파일</h2>
<table>
<thead>
<tr>
<th>파일</th>
<th>내용</th>
</tr>
</thead>
<tbody><tr>
<td>references/partitioning.md</td>
<td>파티션 키 전략, 계층적 키, 핫 파티션 감지 및 완화</td>
</tr>
<tr>
<td>references/query-patterns.md</td>
<td>쿼리 최적화, 집계, 페이지 분할, 트랜잭션, 변경 피드</td>
</tr>
<tr>
<td>scripts/setup_cosmos_container.py</td>
<td>파티셔닝, 처리량 및 인덱싱을 적용하여 컨테이너를 생성하는 CLI 도구</td>
</tr>
</tbody></table>                                
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 |

모든 파일

0개 파일

azure-cosmos-py 설치

스킬 파일을 다운로드하여 .claude/skills/ 디렉터리에 압축을 풀어주세요.

ZIP 다운로드

저장소를 클론하고 스킬 파일을 프로젝트에 복사하세요.

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

복사 복사
빠른 설정: 스킬 폴더를 .claude/skills/로 복사하세요. Claude가 해당 스킬을 자동으로 감지하여 사용할 것입니다.
저장소 microsoft/skills

관련 스킬

microservices-patterns
업데이트 된 시간 2026년 6월 29일
jpa-patterns
업데이트 된 시간 2026년 6월 30일
fabric-lakehouse
업데이트 된 시간 2026년 6월 30일
prisma-expert
업데이트 된 시간 2026년 6월 29일