DynamoDB Query in Go (AWS SDK v2)
Query liest jedes Item, das denselben Partitionsschlüssel teilt, und grenzt optional über den Sortierschlüssel ein. Im AWS SDK for Go v2 schreibst du eine KeyConditionExpression auf einem dynamodb.QueryInput, und der eingebaute QueryPaginator folgt LastEvaluatedKey über jede Ergebnisseite für dich.
Code
package main
import (
"context"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)
func main() {
ctx := context.TODO()
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("us-east-1"))
if err != nil {
log.Fatalf("load config: %v", err)
}
client := dynamodb.NewFromConfig(cfg)
paginator := dynamodb.NewQueryPaginator(client, &dynamodb.QueryInput{
TableName: aws.String("Music"),
KeyConditionExpression: aws.String(
"#hashKey = :hashKeyValue AND begins_with(#rangeKey, :rangeKeyValue)"),
ExpressionAttributeNames: map[string]string{
"#hashKey": "Artist",
"#rangeKey": "SongTitle",
},
ExpressionAttributeValues: map[string]types.AttributeValue{
":hashKeyValue": &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
":rangeKeyValue": &types.AttributeValueMemberS{Value: "C"},
},
})
var items []map[string]types.AttributeValue
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
log.Fatalf("query: %v", err)
}
items = append(items, page.Items...)
}
fmt.Printf("Found %d items\n", len(items))
}Erklärung
KeyConditionExpression— muss eine Gleichheit auf dem Partitionsschlüssel enthalten (#hashKey = :hashKeyValue) plus höchstens eine Sortierschlüssel-Bedingung (=,<,<=,>,>=,BETWEENoderbegins_with). Die Aliase#hashKey/#rangeKeylösen perExpressionAttributeNameszuArtist/SongTitleauf (reservierte-Wort-sicher).ExpressionAttributeValues— die:placeholder→ typisierter-Wert-Map (&types.AttributeValueMemberS{...}).- Pagination — ein
Querygibt höchstens 1 MB zurück.dynamodb.NewQueryPaginatorumschließt den Client und ruft weiter auf, bisLastEvaluatedKeyerschöpft ist; dieHasMorePages()/NextPage(ctx)-Schleife ist das kanonische Muster des SDK. - Setze
ScanIndexForward: aws.Bool(false), um die Sortierschlüssel-Reihenfolge umzukehren (aufsteigend ist der Standard). - Frage einen Sekundärindex ab, indem du
IndexName: aws.String("...")hinzufügst. - Lieber Bedingungen im Code bauen? Das
expression-Paket (github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression) setztexpression.Key(...).Equal(...)-Builder zusammen und generiert die Name-/Wert-Maps;attributevalue.UnmarshalListOfMapsverwandeltpage.Itemsin Go-Structs.
Visuell erledigen
Der DynamoDB Expression Builder stellt die Schlüsselbedingung zusammen und kopiert lauffähigen Code, sodass du keine Platzhalter- und Wert-Maps von Hand schreiben musst.
Um Abfragen gegen echte Tabellen in einer GUI auszuführen — Schlüsselbedingungs-Formular, paginiertes Raster, Copy-as-Code — lade DynoTable herunter.
Verwandte Beispiele
- DynamoDB Query in Java — dieselbe Abfrage mit AWS SDK for Java 2.x.
- DynamoDB Scan in Go — wenn du dich nicht in eine Partition einschlüsseln kannst.
- Query vs. Scan — warum
Queryder richtige Standard ist. - Key-Condition-Ausdrücke — jeder legale Partitions-/Sortierschlüssel-Operator.
- "Query condition missed key schema element" — die Schlüsselbedingung benennt das falsche Attribut oder überspringt den Partitionsschlüssel.
- "Query key condition not supported" — ein Operator, den die Schlüsselbedingung nicht nutzen kann, wie contains oder eine zweite Sortierschlüssel-Bedingung.
References
- Query — Amazon DynamoDB API Reference
- Use Query with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- dynamodb package — AWS SDK for Go v2 (pkg.go.dev)
- expression package — AWS SDK for Go v2 (pkg.go.dev)
- Querying tables — Amazon DynamoDB Developer Guide
Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.