Table Storage
Introduction
Section titled “Introduction”Azure Table Storage is a NoSQL key-value store designed for large volumes of semi-structured data, useful for lightweight metadata, lookup records, and simple operational datasets. Data is organized into tables, partitions, and entities addressed by PartitionKey and RowKey. It offers schemaless flexibility at a fraction of the cost of traditional SQL, making it easy to adapt as your application evolves. For more information, see What is Azure Table storage?
LocalStack for Azure provides a local environment for building and testing applications that make use of Azure Table Storage. The supported APIs are available on our API Coverage section, which provides information on the extent of Table Storage’s integration with LocalStack.
Getting started
Section titled “Getting started”This guide is designed for users new to Table Storage and assumes basic knowledge of the Azure CLI and our azlocal wrapper script.
Start your LocalStack container using your preferred method. For more information, see Introduction to LocalStack for Azure.
Create a resource group
Section titled “Create a resource group”Create a resource group to contain your storage resources:
azlocal group create \ --name rg-table-demo \ --location westeurope{ "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-table-demo", "location": "westeurope", "managedBy": null, "name": "rg-table-demo", "properties": { "provisioningState": "Succeeded" }, "tags": null, "type": "Microsoft.Resources/resourceGroups"}Create a storage account
Section titled “Create a storage account”Create a storage account in the resource group:
azlocal storage account create \ --name sttabledemols \ --resource-group rg-table-demo \ --location westeurope \ --sku Standard_LRS{ ... "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-table-demo/providers/Microsoft.Storage/storageAccounts/sttabledemols", ... "name": "sttabledemols", ... "placement": null, "primaryEndpoints": { "blob": "https://sttabledemolsblob.localhost.localstack.cloud:4566", ... "table": "https://sttabledemolstable.localhost.localstack.cloud:4566", ... }, ....}Authentication
Section titled “Authentication”There are three ways to authenticate storage table commands against the emulator:
Storage account key
Section titled “Storage account key”Retrieve the account key and pass it with --account-name and --account-key:
ACCOUNT_KEY=$(azlocal storage account keys list \ --account-name sttabledemols \ --resource-group rg-table-demo \ --query "[0].value" \ --output tsv)
azlocal storage table list \ --account-name sttabledemols \ --account-key "$ACCOUNT_KEY"Login credentials
Section titled “Login credentials”Use --auth-mode login to authenticate with the current session credentials:
azlocal storage table list \ --account-name sttabledemols \ --auth-mode loginConnection string
Section titled “Connection string”Bundle the account name and key into a single value:
CONNECTION_STRING=$(azlocal storage account show-connection-string \ --name sttabledemols \ --resource-group rg-table-demo \ --query connectionString -o tsv)
azlocal storage table list \ --connection-string "$CONNECTION_STRING"The remaining examples in this guide use connection strings for brevity.
Create and inspect a table
Section titled “Create and inspect a table”Create a table:
azlocal storage table create \ --name apptable \ --connection-string "$CONNECTION_STRING"{ "created": true}Verify the table exists:
azlocal storage table exists \ --name apptable \ --connection-string "$CONNECTION_STRING"{ "exists": true}List tables in the storage account:
azlocal storage table list \ --connection-string "$CONNECTION_STRING"[ { "name": "apptable" }]Insert and query entities
Section titled “Insert and query entities”Insert an entity into the table:
azlocal storage entity insert \ --table-name apptable \ --entity PartitionKey=demo RowKey=1 name=Alice score=100 \ --connection-string "$CONNECTION_STRING"{ "content": { "PartitionKey": "demo", "RowKey": "1", "name": "Alice", "score": 100, ... }, "etag": "W/\"datetime'...'\"", ...}Retrieve the entity by its partition key and row key:
azlocal storage entity show \ --table-name apptable \ --partition-key demo \ --row-key 1 \ --connection-string "$CONNECTION_STRING"{ "PartitionKey": "demo", "RowKey": "1", "name": "Alice", "score": 100, ...}Query entities by partition key:
azlocal storage entity query \ --table-name apptable \ --filter "PartitionKey eq 'demo'" \ --connection-string "$CONNECTION_STRING"{ "items": [ { "PartitionKey": "demo", "RowKey": "1", "name": "Alice", "score": 100, ... } ], "nextMarker": {}}Update, merge, and delete entities
Section titled “Update, merge, and delete entities”Update the entity with a merge operation:
azlocal storage entity merge \ --table-name apptable \ --entity PartitionKey=demo RowKey=1 score=101 \ --connection-string "$CONNECTION_STRING"{ "etag": "W/\"datetime'...'\"", ...}Delete the entity and verify the table is empty:
azlocal storage entity delete \ --table-name apptable \ --partition-key demo \ --row-key 1 \ --connection-string "$CONNECTION_STRING"
azlocal storage entity query \ --table-name apptable \ --connection-string "$CONNECTION_STRING"{ "deleted": null}{ "items": [], "nextMarker": {}}Features
Section titled “Features”The Table Storage emulator supports the following features:
- Data plane REST API: Table CRUD, entity operations (insert, query, merge, replace, delete), OData query filters, and batch/transaction requests.
- Control plane REST API: Create and get tables, get and set table service properties via Azure Resource Manager.
- Multiple authentication modes: Storage account key, login credentials, and connection strings.
- Entity operations: Insert, query, show, merge, replace, and delete entities with schemaless, key-value data addressed by
PartitionKeyandRowKey. - OData query support: Filter and project entities using OData expressions (e.g.,
PartitionKey eq 'demo'). - Batch operations: Entity batch (transaction) requests are proxied with correct URL and authorization rewriting.
Limitations
Section titled “Limitations”- No data persistence across restarts: Table data is not persisted and is lost when the LocalStack emulator is stopped or restarted.
- Table service properties:
set_service_propertiesis a no-op andget_service_propertiesreturns empty defaults, unlike Azure where CORS, logging, and metrics settings are persisted and applied. - Storage account keys: Keys are emulator-generated rather than managed by Azure.
- Header validation: Unsupported request headers or parameters are silently accepted (Azurite runs in loose mode) instead of being rejected.
- API version enforcement: The emulator does not validate the
x-ms-versionheader; all API versions are accepted.
Samples
Section titled “Samples”The following sample demonstrates how to use Table Storage with LocalStack for Azure:
API Coverage
Section titled “API Coverage”| Operation ▲ | Implemented ▼ |
|---|