Skip to content

API Parity

Mark Lauter edited this page May 16, 2026 · 5 revisions

API Parity

Overview

DynamoDbLite implements the IAmazonDynamoDB interface from AWSSDK.DynamoDBv2. This page documents which operations are supported, partial, stubbed, or out of scope, and highlights behavioral differences from real DynamoDB. See the DynamoDB API Reference for the full AWS API specification.

Operation support matrix

Table management

Operation Status Notes
CreateTableAsync Supported Immediate ACTIVE status
DeleteTableAsync Supported Synchronous deletion
DescribeTableAsync Supported Exact item count and size
ListTablesAsync Supported All overloads
UpdateTableAsync Partial GSI create/delete; throughput and billing-mode changes accepted but no-op; other UpdateTable fields silently ignored

Item CRUD

Operation Status Notes
PutItemAsync Supported ConditionExpression, ReturnValues (ALL_OLD)
GetItemAsync Supported ProjectionExpression, ConsistentRead (no-op)
DeleteItemAsync Supported ConditionExpression, ReturnValues (ALL_OLD)
UpdateItemAsync Supported All UpdateExpression clauses, all ReturnValues modes

Query & Scan

Operation Status Notes
QueryAsync Supported KeyConditionExpression, FilterExpression, pagination, index queries
ScanAsync Supported FilterExpression, pagination, index scans, legacy overloads

Batch operations

Operation Status Notes
BatchGetItemAsync Supported Multi-table, ProjectionExpression per table
BatchWriteItemAsync Supported Mixed put/delete, duplicate detection

Transactions

Operation Status Notes
TransactWriteItemsAsync Supported All action types, idempotency tokens
TransactGetItemsAsync Supported Multi-table, ProjectionExpression

Secondary indexes

Feature Status Notes
GSI at table creation Supported Up to 5
LSI at table creation Supported Up to 5
GSI via UpdateTable Supported With immediate backfill
GSI deletion Supported
Projection types (ALL, KEYS_ONLY, INCLUDE) Supported
Sparse indexes Supported
ConsistentRead=true on GSI Supported Throws AmazonDynamoDBException, matching DynamoDB's rejection of strongly-consistent reads on GSIs

TTL

Operation Status Notes
UpdateTimeToLiveAsync Supported Enable/disable; enabling immediately backfills existing items' TTL epoch
DescribeTimeToLiveAsync Supported

Tags

Operation Status Notes
TagResourceAsync Supported
UntagResourceAsync Supported
ListTagsOfResourceAsync Supported

Admin / endpoints

Operation Status Notes
DescribeEndpointsAsync Stubbed Returns dynamodb.localhost
DescribeLimitsAsync Stubbed Returns hardcoded limits (account: 80,000 R/W; table: 40,000 R/W)
DetermineServiceOperationEndpoint Stubbed Returns http://dynamodb.localhost
Paginators Stubbed Property returns null; iterate manually with LastEvaluatedKey

Export & import

Operation Status Notes
ExportTableToPointInTimeAsync Supported Local filesystem via S3Bucket field (treated as a directory path); DYNAMODB_JSON only
DescribeExportAsync Supported
ListExportsAsync Supported
ImportTableAsync Supported Local filesystem via S3BucketSource.S3Bucket field (treated as a directory path); DYNAMODB_JSON only
DescribeImportAsync Supported
ListImportsAsync Supported

Out of scope

These operations are meaningless for an in-process embedded emulator and will not be implemented. Every method below throws NotSupportedException.

Backup & restore:

  • CreateBackupAsync
  • DeleteBackupAsync
  • DescribeBackupAsync
  • DescribeContinuousBackupsAsync
  • ListBackupsAsync
  • RestoreTableFromBackupAsync
  • RestoreTableToPointInTimeAsync
  • UpdateContinuousBackupsAsync

Global tables & replication:

  • CreateGlobalTableAsync
  • DescribeGlobalTableAsync
  • DescribeGlobalTableSettingsAsync
  • DescribeTableReplicaAutoScalingAsync
  • ListGlobalTablesAsync
  • UpdateGlobalTableAsync
  • UpdateGlobalTableSettingsAsync
  • UpdateTableReplicaAutoScalingAsync

Kinesis streaming:

  • DescribeKinesisStreamingDestinationAsync
  • DisableKinesisStreamingDestinationAsync
  • EnableKinesisStreamingDestinationAsync
  • UpdateKinesisStreamingDestinationAsync

PartiQL:

  • BatchExecuteStatementAsync
  • ExecuteStatementAsync
  • ExecuteTransactionAsync

Contributor insights:

  • DescribeContributorInsightsAsync
  • ListContributorInsightsAsync
  • UpdateContributorInsightsAsync

Resource policies:

  • DeleteResourcePolicyAsync
  • GetResourcePolicyAsync
  • PutResourcePolicyAsync

Behavioral differences

Behavior DynamoDB DynamoDbLite
Table status transitions CREATING → ACTIVE → DELETING Immediately ACTIVE; synchronous deletion
GSI creation CREATING status, eventual backfill Synchronous backfill, immediately ACTIVE
Provisioned throughput Enforced; throttling on exceeded capacity Stored but not enforced; no throttling
Consumed capacity Tracked and returned Not tracked
ConsistentRead Eventually vs strongly consistent All reads are strongly consistent (SQLite)
TTL deletion Items deleted ~48 hours after expiry; may still appear in reads Items filtered instantly at read time; physically deleted within 30s
TTL enable/disable Can take up to 1 hour Immediate
Item count / table size Updated approximately every 6 hours Updated on every write (exact)
Table ARN Region-specific, real account ID arn:aws:dynamodb:local:000000000000:table/{name}
Export/Import S3-based Local filesystem (the S3Bucket field is reused as a directory path)
Export/Import format DYNAMODB_JSON and ION DYNAMODB_JSON only
Parallel scan Supports segments for parallelism Segments honored but applied post-retrieval — partitions results, does not reduce per-call work; Limit counts pre-segmentation
Idempotency token Persisted server-side In-memory cache with 10-minute TTL
UnprocessedKeys/Items May return unprocessed items under throttling Always empty (all items processed)
Auto-scaling Adjusts throughput based on load Not applicable
Encryption At-rest and in-transit encryption Not applicable (local storage)
Point-in-time recovery Continuous backups Out of scope
DynamoDB Streams Change data capture Out of scope
Global tables Multi-region replication Out of scope

Known limitations

  • Parallel scan caveatsTotalSegments / Segment partition results post-retrieval. Each segment returns disjoint items, but segmentation does not reduce per-call work, and Limit applies to the pre-segmentation row count.
  • Connection strings — must follow Microsoft.Data.Sqlite format
  • PaginatorsIDynamoDBv2PaginatorFactory returns null; the idiomatic client.Paginators.ScanAsync(...) pattern throws NullReferenceException. Iterate paginated results manually with LastEvaluatedKey.

Clone this wiki locally