The Dapr Go SDK provides several ways to interact with a state store:
Simple Operations
Use SaveState, GetState, and DeleteState for basic key-value operations.
Bulk and Transactional Operations
- Bulk Save: Use
SaveBulkState to save multiple *dapr.SetStateItem objects at once. - Bulk Get: Use
GetBulkState to retrieve multiple keys in a single operation. - Transactions: Use
ExecuteStateTransaction to execute multiple *dapr.StateOperation (Upsert or Delete) operations atomically.
Querying State
Use QueryState to retrieve, filter, and sort data. Note: This API is currently in alpha.
Granular Control
The dapr.SetStateItem type allows you to specify Etag, Metadata, and dapr.StateOptions (for Concurrency and Consistency) for individual items.
// Simple Save/Get/Delete
if err := client.SaveState(ctx, store, "key1", data, nil); err != nil { panic(err) }
item, err := client.GetState(ctx, store, "key1", nil)
if err := client.DeleteState(ctx, store, "key1", nil); err != nil { panic(err) }
// Bulk Save
item1 := &dapr.SetStateItem{
Key: "key1",
Value: []byte("hello"),
Options: &dapr.StateOptions{
Concurrency: dapr.StateConcurrencyLastWrite,
Consistency: dapr.StateConsistencyStrong,
},
}
client.SaveBulkState(ctx, store, item1)
// Transactional
ops := []*dapr.StateOperation{
{Type: dapr.StateOperationTypeUpsert, Item: &dapr.SetStateItem{Key: "key1", Value: data}},
{Type: dapr.StateOperationTypeDelete, Item: &dapr.SetStateItem{Key: "key2"}},
}
client.ExecuteStateTransaction(ctx, store, meta, ops)
// Query (Alpha)
query := `{"filter": {"EQ": {"value.Id": "1"}}, "sort": [{"key": "value.Balance", "order": "DESC"}]}`
queryResponse, err := client.QueryState(ctx, "querystore", query)