Table Storage
Compatible with the azure-data-tables SDKs (Java, Python, Node.js) and Azurite-style connection
strings. Speaks the Azure Table REST protocol with OData/JSON payloads and Shared Key
authentication.
HTTP-only — no Docker. Data is held by the configured storage backend (
memoryby default;persistent,hybrid, orwalfor durability).
Features
- Tables — Create, Delete, List; duplicate create returns
409 TableAlreadyExists - Entities — Insert, Update (replace/merge), Upsert, Delete, Get by
PartitionKey+RowKey; missing entity returns the Azure404 ResourceNotFoundshape - Query —
$filterOData expressions: equality onPartitionKey/RowKey, numeric comparisons, and combinations;$selectprojects a subset of properties - Pagination — large result sets are paged with continuation tokens
(
x-ms-continuation-Next*headers) - Optimistic concurrency —
ETag/If-Matchon update and delete; a stale ETag is rejected - Batch transactions —
$batchmultipart change sets are applied atomically
Endpoint
http://localhost:4577/{account}-table/Tables # table operations
http://localhost:4577/{account}-table/{table}(PartitionKey='p',RowKey='r') # entity operations
http://localhost:4577/{account}-table/$batch # batch transactions
Quickstart
from azure.data.tables import TableServiceClient
conn = ("DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;"
"AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMh0==;"
"TableEndpoint=http://localhost:4577/devstoreaccount1-table;")
svc = TableServiceClient.from_connection_string(conn)
table = svc.create_table("people")
table.upsert_entity({"PartitionKey": "team", "RowKey": "alice", "role": "eng"})
for e in table.query_entities("PartitionKey eq 'team'"):
print(e["RowKey"], e["role"])
The well-known Azurite development key (Eby8vdM0…) is accepted; any account name works.
Configuration
floci-az:
services:
table:
enabled: true
storage:
services:
table:
# mode: persistent # override the global storage.mode for table only
flush-interval-ms: 5000
| Property | Env var | Default | Description |
|---|---|---|---|
enabled |
FLOCI_AZ_SERVICES_TABLE_ENABLED |
true |
Enables the Table Storage service |
storage.services.table.mode |
FLOCI_AZ_STORAGE_SERVICES_TABLE_MODE |
(inherits storage.mode) |
Per-service backend override (memory / persistent / hybrid / wal) |
storage.services.table.flush-interval-ms |
FLOCI_AZ_STORAGE_SERVICES_TABLE_FLUSH_INTERVAL_MS |
5000 |
Background flush-to-disk interval for the hybrid mode only; ignored by memory / persistent / wal (wal compacts on storage.wal.compaction-interval-ms instead) |
Intentional deviations
- Shared Key signatures are accepted but not cryptographically verified.
- The
$filtergrammar is a practical subset — equality, numeric comparison, and basic boolean composition are supported; full OData functions (substringof,startswith, datetime arithmetic) are not. - No SAS enforcement — SAS query parameters are parsed but not validated.