az-table-catalog
A resilient, event-sourced indexing library for Azure Table Storage.
az-table-catalog allows you to create high-performance, multi-indexed lookup tables without the high minimum monthly fees of Cosmos DB. It uses a Write-Ahead Log (WAL) and a checkpoint-driven recovery model to ensure data consistency even during process crashes.
Project Page
http://shaunwagner.com/projects/az-table-catalog
Why TableCatalog?
Azure Table Storage is extremely cost-effective but lacks native secondary indexes. This library stores one row per (index, record) pair, encoding the index dimension directly into the PartitionKey.
- Multi-Index Queries: Search by any field with O(1) performance.
- Write-Ahead Log: Prevents "split-brain" states during multi-partition writes.
- Range Queries: Filter index partitions by ordered fields (like timestamps).
- Self-Healing: Automatically replays orphaned WAL entries on the next write.
Quick Start
import az_table_catalog
# Configure schema
az_table_catalog.configure(
index_keys=["phone", "email"],
row_key="timestamp"
)
# Insert returns the committed record
user = az_table_catalog.insert({
"phone": "555-634-5789",
"email": "user@example.com",
"timestamp": "2026-02-24T12:00:00Z"
})
# Query any index
results = az_table_catalog.query({"phone": "555-634-5789"})
Configuration
The library can be initialized via configure() or these environment variables:
| Variable | Required | Description |
|---|---|---|
AZURE_STORAGE_CONNECTION_STRING |
Yes | Azure Storage connection string |
TABLE_CATALOG_NAME |
Yes | Primary catalog table name |
TABLE_CATALOG_INDEX_KEYS |
Yes | Comma-separated list of indexed fields |
TABLE_CATALOG_ROW_KEY |
Yes | Field used as the sort key (RowKey base) |
Technical Implementation
- PartitionKey: Formatted as
{len(field)}_{field}{value}to prevent collisions. - RowKey: Derived from the
row_keyvalue and an 8-character MD5 fingerprint of all indexed fields for idempotency.
License
MIT
Metadata
Release files for az-table-catalog 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| az_table_catalog-1.0.1.tar.gz | 7.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| az_table_catalog-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 14.5 kB
Release files / az_table_catalog-1.0.1.tar.gz
| Download URL | az_table_catalog-1.0.1.tar.gz |
|---|---|
| Size | 7.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cf5fd91fc1ae09e5b174cdd275d3a46248061206d537fbaa794402a379b7c9a4
|
|
BLAKE2b-256 checksum How to use checksums |
f44fe217daa0722508e38f150f37f1d4643c1e460c422688167dd4979b20af5f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.9
|
Release files / az_table_catalog-1.0.1-py3-none-any.whl
| Download URL | az_table_catalog-1.0.1-py3-none-any.whl |
|---|---|
| Size | 7.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8339a1701bb0353630fab246f2985bbf0f54f540117c119c5218b7e0e796e7dd
|
|
BLAKE2b-256 checksum How to use checksums |
40bdd771081b381ba92f808ef4e974650c7e5cd11459a6a77ec6373e9212ab4d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.9
|