azure-data-tables-py

npx skills add https://github.com/microsoft/skills --skill azure-data-tables-py

SDK Azure Tables pour Python

Magasin de clés-valeurs NoSQL pour données structurées (Azure Storage Tables ou API Table Cosmos DB).

Installation

pip install azure-data-tables azure-identity

Variables d'environnement

# Azure Storage Tables
AZURE_STORAGE_ACCOUNT_URL=https://<account>.table.core.windows.net  # Requis pour Azure Storage Tables

# Cosmos DB Table API
COSMOS_TABLE_ENDPOINT=https://<account>.table.cosmos.azure.com  # Requis pour l'API Table Cosmos DB
AZURE_TOKEN_CREDENTIALS=prod # Requis uniquement si DefaultAzureCredential est utilisé en production

Authentification

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

# Dev local : DefaultAzureCredential. Production : définir AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Ou utiliser une credential spécifique directement en production :
# Voir 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 (gérer les tables)
service_client = TableServiceClient(endpoint=endpoint, credential=credential)

# Table client (travailler avec les entités)
table_client = TableClient(endpoint=endpoint, table_name="mytable", credential=credential)

Types de clients

Client Objectif
TableServiceClient Créer/supprimer tables, lister tables
TableClient CRUD entités, requêtes

Opérations sur tables

# Créer table
service_client.create_table("mytable")

# Créer si n'existe pas
service_client.create_table_if_not_exists("mytable")

# Supprimer table
service_client.delete_table("mytable")

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

# Obtenir le client table
table_client = service_client.get_table_client("mytable")

Opérations sur entités

Important : Chaque entité nécessite PartitionKey et RowKey (ensemble ils forment un identifiant unique).

Créer une entité

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

# Créer (échoue si existe)
table_client.create_entity(entity=entity)

# Upsert (créer ou remplacer)
table_client.upsert_entity(entity=entity)

Obtenir une entité

# Obtenir par clé (plus rapide)
entity = table_client.get_entity(
    partition_key="sales",
    row_key="order-001"
)
print(f"Product: {entity['product']}")

Mettre à jour une entité

# Remplacer entité complète
entity["quantity"] = 10
table_client.update_entity(entity=entity, mode="replace")

# Fusionner (mettre à jour champs spécifiques uniquement)
update = {
    "PartitionKey": "sales",
    "RowKey": "order-001",
    "shipped": True
}
table_client.update_entity(entity=update, mode="merge")

Supprimer une entité

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

Requêtes sur entités

Requête dans une partition

# Requête par partition (efficace)
entities = table_client.query_entities(
    query_filter="PartitionKey eq 'sales'"
)
for entity in entities:
    print(entity)

Requête avec filtres

# Filtrer par propriétés
entities = table_client.query_entities(
    query_filter="PartitionKey eq 'sales' and quantity gt 3"
)

# Avec paramètres (plus sûr)
entities = table_client.query_entities(
    query_filter="PartitionKey eq @pk and price lt @max_price",
    parameters={"pk": "sales", "max_price": 50.0}
)

Sélectionner propriétés spécifiques

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

Lister toutes les entités

# Lister tous (multi-partition - utiliser avec modération)
for entity in table_client.list_entities():
    print(entity)

Opérations par lot

from azure.data.tables import TableTransactionError

# Opérations par lot (même partition uniquement !)
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}")

Client asynchrone

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

async def table_operations():
    credential = DefaultAzureCredential()

    async with TableClient(
        endpoint="https://<account>.table.core.windows.net",
        table_name="mytable",
        credential=credential
    ) as client:
        # Créer
        await client.create_entity(entity={
            "PartitionKey": "async",
            "RowKey": "1",
            "data": "test"
        })

        # Requête
        async for entity in client.query_entities("PartitionKey eq 'async'"):
            print(entity)

import asyncio
asyncio.run(table_operations())

Types de données

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

Bonnes pratiques

  1. Concevoir les clés de partition pour les motifs de requête et une distribution uniforme
  2. Requêtes dans partitions autant que possible (multi-partition est coûteux)
  3. Utiliser opérations par lot pour plusieurs entités dans même partition
  4. Utiliser upsert_entity pour des écritures idempotentes
  5. Utiliser requêtes paramétrées pour prévenir l'injection
  6. Garder entités petites — max 1 MB par entité
  7. Utiliser client asynchrone pour scénarios haut débit

Skills similaires