вариант

azure-data-tables-py

microsoft/skills microsoft/skills

Содержит примеры кода и рекомендации по использованию SDK Azure Tables для Python для работы с хранилищами данных NoSQL типа «ключ-значение», выполнения операций CRUD с сущностями, пакетных операций и запросов к Azure Storage Tables или Cosmos DB Table API.

...Расширить все
1
Обновлено время 13 сентября 2026 г.

SDK Azure Tables для Python

Хранилище NoSQL типа «ключ-значение» для структурированных данных (Azure Storage Tables или Cosmos DB Table API).

Установка

pip install azure-data-tables azure-identity

Переменные среды

# Таблицы хранилища Azure
AZURE_STORAGE_ACCOUNT_URL=https://.table.core.windows.net  # Требуется для таблиц хранилища Azure

# Cosmos DB Table API
COSMOS_TABLE_ENDPOINT=https://.table.cosmos.azure.com  # Требуется для Cosmos DB Table API
AZURE_TOKEN_CREDENTIALS=prod # Требуется только в том случае, если DefaultAzureCredential используется в производственной среде

Аутентификация и жизненный цикл

🔑 К каждому приведённому ниже примеру кода применяются два правила:

  1. Предпочтительно использовать DefaultAzureCredential. Он работает как локально (Azure CLI / VS Code / Developer CLI), так и в Azure (управляемая идентичность, идентичность рабочей нагрузки) без изменения кода. Избегайте использования строк подключения, учетных записей и ключей API — они обходят аудит и ротацию Entra.
    • Локальная разработка: DefaultAzureCredential работает без изменений.
    • Производственная среда: установите AZURE_TOKEN_CREDENTIALS=prod (или AZURE_TOKEN_CREDENTIALS=), чтобы ограничить цепочку учетных данных учетными данными, безопасными для производственной среды.
  2. Оберните каждый клиент в менеджер контекста, чтобы HTTP-транспорты, сокеты и кэши токенов освобождались детерминированно:
    • Синхронный режим: с (...) в качестве клиента:
    • Асинхронный режим: async с (...) в качестве клиента: и async с DefaultAzureCredential() в качестве учетных данных: (из azure.identity.aio)

В фрагментах кода эту настройку можно сократить, но в производственном коде всегда следует соблюдать оба правила.

import os
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.data.tables import TableServiceClient, TableClient

# Локальная разработка: 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://.table.core.windows.net"

# Клиент службы (управление таблицами)
with TableServiceClient(endpoint=endpoint, credential=credential) as service_client:
    # Используйте service_client здесь (операции см. в следующих разделах)
    ...

# Клиент таблицы (работа с сущностями)
with TableClient(endpoint=endpoint, table_name="mytable", credential=credential) as table_client:
    # Используйте table_client здесь (операции см. в следующих разделах)
    ...

Типы клиентов

Клиент Назначение
TableServiceClient Создание/удаление таблиц, перечень таблиц
TableClient CRUD-операции с сущностями, запросы

Операции с таблицами

# Создать таблицу
service_client.create_table("mytable")

# Создать, если не существует
service_client.create_table_if_not_exists("mytable")

# Удаление таблицы
service_client.delete_table("mytable")

# Вывод списка таблиц
for table in service_client.list_tables():
    print(table.name)

# Получение клиента таблицы
table_client = service_client.get_table_client("mytable")

Операции с сущностями

Важно: Каждому объекту требуются PartitionKey и RowKey (вместе они образуют уникальный идентификатор).

Создание сущности

entity = {
    "PartitionKey": "sales",
    "RowKey": "order-001",
    "product": "Widget",
    "quantity": 5,
    "price": 9.99,
    "shipped": False
}

# Создание (завершится с ошибкой, если сущность уже существует)
table_client.create_entity(entity=entity)

# Upsert (создание или замена)
table_client.upsert_entity(entity=entity)

Получить сущность

# Получение по ключу (самый быстрый способ)
entity = table_client.get_entity(
    partition_key="sales",
    row_key="order-001"
)
print(f"Продукт: {entity['product']}")

Обновление сущности

# Заменить всю сущность
entity["quantity"] = 10
table_client.update_entity(entity=entity, mode="replace")

# Слияние (обновить только определённые поля)
update = {
    "PartitionKey": "sales",
    "RowKey": "order-001",
    "shipped": True
}
table_client.update_entity(entity=update, mode="merge")

Удаление сущности

table_client.delete_entity(
    partition_key="sales",
    row_key="order-001"
)

Запрос сущностей

Запрос внутри партиции

# Запрос по разделам (эффективно)
entities = table_client.query_entities(
    query_filter="PartitionKey eq 'sales'"
)
for entity in entities:
    print(entity)

Запрос с фильтрами

# Фильтрация по свойствам
entities = table_client.query_entities(
    query_filter="PartitionKey eq 'sales' and quantity gt 3"
)

# С параметрами (безопаснее)
entities = table_client.query_entities(
    query_filter="PartitionKey eq @pk and price lt @max_price",
    parameters={"pk": "sales", "max_price": 50.0}
)

Выбор определённых свойств

entities = table_client.query_entities(
    query_filter="PartitionKey eq 'sales'",
    select=["RowKey", "product", "price"]
)

Вывод списка всех сущностей

# Вывод всех сущностей (пересечение партиций — использовать с осторожностью)
for entity in table_client.list_entities():
    print(entity)

Пакетные операции

from azure.data.tables import TableTransactionError

# Пакетные операции (только в одном и том же разбиении!)
operations = [
    ("create", {"PartitionKey": "batch", "RowKey": "1", "data": "first"}),
    ("create", {"PartitionKey": "batch", "RowKey": "2", "data": "second"}),
    ("upsert", {"PartitionKey": "batch", "RowKey": "3", "data": "third"}),
]

try:
    table_client.submit_transaction(operations)
except TableTransactionError as e:
    print(f"Сбой транзакции: {e}")

Асинхронный клиент

from azure.data.tables.aio import TableServiceClient, TableClient
from azure.identity.aio import DefaultAzureCredential

async def table_operations():
    async with DefaultAzureCredential() as credential:
        async with TableClient(
            endpoint="https://.table.core.windows.net",
            table_name="mytable",
            credential=credential
        ) as client:
            # Создать
            await client.create_entity(entity={
                "PartitionKey": "async",
                "RowKey": "1",
                "data": "test"
            })
            
            # Запрос
            async for entity in client.query_entities("PartitionKey eq 'async'"):
                print(entity)

import asyncio
asyncio.run(table_operations())

Типы данных

Тип Python Тип хранилища таблиц
str Строка
int Int64
float Double
bool Boolean
datetime DateTime
байты Двоичный
UUID GUID

Рекомендации

  1. Выберите синхронный ИЛИ асинхронный режим и придерживайтесь его. Не смешивайте синхронные клиенты azure.data.tables с асинхронными клиентами azure.data.tables.aio в одном пути вызова. Выбирайте один режим на модуль.
  2. Всегда используйте контекстные менеджеры для клиентов и асинхронных учетных данных. Оборачивайте каждого клиента с помощью TableClient(...) as client: (синхронный режим) или асинхронного режима с помощью TableClient(...) as client: (асинхронный режим). Для асинхронного режима DefaultAzureCredential из azure.identity.aio также используйте асинхронный режим с параметром credential:, чтобы токены и транспортные данные очищались.
  3. Используйте `DefaultAzureCredential` для переносимой аутентификации как в локальной среде разработки, так и в Azure (по возможности избегайте строк подключения и ключей API).
  4. Разрабатывайте ключи разбиения на партиции с учетом шаблонов запросов и равномерного распределения
  5. По возможностивыполняйте запросы внутри партиций (межпартиционные запросы требуют больших затрат)
  6. Используйте пакетные операции для нескольких сущностей в одном разделе
  7. Используйте ` upsert_entity ` для идемпотентной записи
  8. Используйте параметризованные запросы для предотвращения инъекций
  9. Сохраняйте сущности небольшими — не более 1 МБ на сущность
  10. Используйте асинхронный клиент для сценариев с высокой пропускной способностью
Посмотреть на GitHub
---
name: azure-data-tables-py
description: Provides code samples and best practices for using the Azure Tables SDK for Python to perform NoSQL key-value storage, entity CRUD, batch operations, and queries against Azure Storage Tables or Cosmos DB Table API.
license: MIT
---

# Azure Tables SDK for Python

NoSQL key-value store for structured data (Azure Storage Tables or Cosmos DB Table API).

## Installation

```bash
pip install azure-data-tables azure-identity
```

## Environment Variables

```bash
# Azure Storage Tables
AZURE_STORAGE_ACCOUNT_URL=https://<account>.table.core.windows.net  # Required for Azure Storage Tables

# Cosmos DB Table API
COSMOS_TABLE_ENDPOINT=https://<account>.table.cosmos.azure.com  # Required for Cosmos DB Table API
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.data.tables import TableServiceClient, TableClient

# 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>.table.core.windows.net"

# Service client (manage tables)
with TableServiceClient(endpoint=endpoint, credential=credential) as service_client:
    # Use service_client here (see following sections for operations)
    ...

# Table client (work with entities)
with TableClient(endpoint=endpoint, table_name="mytable", credential=credential) as table_client:
    # Use table_client here (see following sections for operations)
    ...
```

## Client Types

| Client | Purpose |
|--------|---------|
| `TableServiceClient` | Create/delete tables, list tables |
| `TableClient` | Entity CRUD, queries |

## Table Operations

```python
# Create table
service_client.create_table("mytable")

# Create if not exists
service_client.create_table_if_not_exists("mytable")

# Delete table
service_client.delete_table("mytable")

# List tables
for table in service_client.list_tables():
    print(table.name)

# Get table client
table_client = service_client.get_table_client("mytable")
```

## Entity Operations

**Important**: Every entity requires `PartitionKey` and `RowKey` (together form unique ID).

### Create Entity

```python
entity = {
    "PartitionKey": "sales",
    "RowKey": "order-001",
    "product": "Widget",
    "quantity": 5,
    "price": 9.99,
    "shipped": False
}

# Create (fails if exists)
table_client.create_entity(entity=entity)

# Upsert (create or replace)
table_client.upsert_entity(entity=entity)
```

### Get Entity

```python
# Get by key (fastest)
entity = table_client.get_entity(
    partition_key="sales",
    row_key="order-001"
)
print(f"Product: {entity['product']}")
```

### Update Entity

```python
# Replace entire entity
entity["quantity"] = 10
table_client.update_entity(entity=entity, mode="replace")

# Merge (update specific fields only)
update = {
    "PartitionKey": "sales",
    "RowKey": "order-001",
    "shipped": True
}
table_client.update_entity(entity=update, mode="merge")
```

### Delete Entity

```python
table_client.delete_entity(
    partition_key="sales",
    row_key="order-001"
)
```

## Query Entities

### Query Within Partition

```python
# Query by partition (efficient)
entities = table_client.query_entities(
    query_filter="PartitionKey eq 'sales'"
)
for entity in entities:
    print(entity)
```

### Query with Filters

```python
# Filter by properties
entities = table_client.query_entities(
    query_filter="PartitionKey eq 'sales' and quantity gt 3"
)

# With parameters (safer)
entities = table_client.query_entities(
    query_filter="PartitionKey eq @pk and price lt @max_price",
    parameters={"pk": "sales", "max_price": 50.0}
)
```

### Select Specific Properties

```python
entities = table_client.query_entities(
    query_filter="PartitionKey eq 'sales'",
    select=["RowKey", "product", "price"]
)
```

### List All Entities

```python
# List all (cross-partition - use sparingly)
for entity in table_client.list_entities():
    print(entity)
```

## Batch Operations

```python
from azure.data.tables import TableTransactionError

# Batch operations (same partition only!)
operations = [
    ("create", {"PartitionKey": "batch", "RowKey": "1", "data": "first"}),
    ("create", {"PartitionKey": "batch", "RowKey": "2", "data": "second"}),
    ("upsert", {"PartitionKey": "batch", "RowKey": "3", "data": "third"}),
]

try:
    table_client.submit_transaction(operations)
except TableTransactionError as e:
    print(f"Transaction failed: {e}")
```

## Async Client

```python
from azure.data.tables.aio import TableServiceClient, TableClient
from azure.identity.aio import DefaultAzureCredential

async def table_operations():
    async with DefaultAzureCredential() as credential:
        async with TableClient(
            endpoint="https://<account>.table.core.windows.net",
            table_name="mytable",
            credential=credential
        ) as client:
            # Create
            await client.create_entity(entity={
                "PartitionKey": "async",
                "RowKey": "1",
                "data": "test"
            })
            
            # Query
            async for entity in client.query_entities("PartitionKey eq 'async'"):
                print(entity)

import asyncio
asyncio.run(table_operations())
```

## Data Types

| Python Type | Table Storage Type |
|-------------|-------------------|
| `str` | String |
| `int` | Int64 |
| `float` | Double |
| `bool` | Boolean |
| `datetime` | DateTime |
| `bytes` | Binary |
| `UUID` | Guid |

## Best Practices

1. **Pick sync OR async and stay consistent.** Do not mix `azure.data.tables` sync clients with `azure.data.tables.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 TableClient(...) as client:` (sync) or `async with TableClient(...) 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. **Design partition keys** for query patterns and even distribution
5. **Query within partitions** whenever possible (cross-partition is expensive)
6. **Use batch operations** for multiple entities in same partition
7. **Use `upsert_entity`** for idempotent writes
8. **Use parameterized queries** to prevent injection
9. **Keep entities small** — max 1MB per entity
10. **Use async client** for high-throughput scenarios

Все файлы

0 файлов

Установить azure-data-tables-py

Скачайте файлы навыков и распакуйте их в каталог .claude/skills/.

Скачать ZIP

Клонируйте репозиторий и скопируйте файлы навыка в свой проект.

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

Копировать Копировать
Быстрая настройка: Скопируйте папку со скиллом в каталог .claude/skills/ Claude автоматически обнаружит и начнет использовать этот скилл
Репозиторий microsoft/skills

Похожие навыки

algorithmic-art
Обновлено время 27 августа 2026 г.
tech-debt-tracker
Обновлено время 29 августа 2026 г.
receiving-code-review
Обновлено время 3 сентября 2026 г.
deprecation-and-migration
Обновлено время 3 сентября 2026 г.
OR