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