DynamoDB GetItem in Go (AWS SDK v2)
Im AWS SDK for Go v2 ist ein Item eine map[string]types.AttributeValue, und types.AttributeValue ist ein versiegeltes Interface: Die einzigen Implementierungen sind die zehn AttributeValueMember*-Structs, die das SDK mitbringt. Damit einen Key zu schreiben ist einfach. Werte wieder herauszulesen ist die Stelle, an der Go von jedem anderen SDK abweicht.
client.GetItem will nach wie vor den vollständigen Primärschlüssel, genau wie überall sonst.
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)
out, err := client.GetItem(ctx, &dynamodb.GetItemInput{
TableName: aws.String("Music"),
Key: map[string]types.AttributeValue{
"Artist": &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
"SongTitle": &types.AttributeValueMemberS{Value: "Cubano Chant"},
},
ProjectionExpression: aws.String("#proj0, #proj1, #proj2, #proj3"),
ExpressionAttributeNames: map[string]string{
"#proj0": "Artist",
"#proj1": "SongTitle",
"#proj2": "AlbumTitle",
"#proj3": "Year",
},
})
if err != nil {
log.Fatalf("get item: %v", err)
}
if out.Item == nil {
fmt.Println("Item not found")
return
}
fmt.Println(out.Item)
}Erklärung
- Skalare sind Pointer —
TableName,ProjectionExpressionundConsistentReadsind*stringbzw.*bool, damit das SDK „nicht gesetzt" vom Nullwert unterscheiden kann.aws.String,aws.Boolundaws.Int32existieren genau dafür und für sonst nichts. - Zahlen kommen als Strings an —
AttributeValueMemberN.Valueist einstring, weil DynamoDB Zahlen auf der Leitung als Strings sendet.Yearzu lesen heißtout.Item["Year"].(*types.AttributeValueMemberN)und danachstrconv.Atoi. Nutze die Comma-ok-Form der Type Assertion; die nackte Form löst eine Panic aus, wenn das Attribut fehlt oder einen anderen Typ hat. attributevalue.UnmarshalMapist der Ausweg — ausgithub.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue; es mappt das gesamte Item auf ein Struct mitdynamodbav-Tags und erledigt die String-zu-Zahl-Umwandlung. Lohnt sich, sobald ein Item mehr als eine Handvoll Attribute hat.out.Itemistnil, wenn nichts gefunden wird, underrist es ebenfalls.len(out.Item) == 0deckt nil und leer zugleich ab, wenn du beides nicht unterscheiden musst.- Fehler mit
errors.Asabgleichen — Go v2 verpackt Service-Fehler in einen Smithy-Operation-Error, sodass sowohlerr == …als auch String-Matching auferr.Error()stillschweigend fehlschlagen. Deklarierevar nf *types.ResourceNotFoundExceptionund übergib dessen Adresse. ConsistentRead: aws.Bool(true)verdoppelt die Lesekosten und wird auf einem GSI abgelehnt. Die#proj-Aliase oben sind ebenfalls keine Deko:Yearist ein reserviertes Wort, und eine Projection, die es direkt benennt, wird zurückgewiesen.
Mach es visuell
Zwischen der AttributeValueMember*-Form und schlichtem JSON hin- und herzuübersetzen ist in Go eine ständige Steuer. Der DynamoDB-JSON-Konverter macht diesen Hin- und Rückweg im Browser, wenn du nur ein Item lesen oder einfügen willst.
DynoTable zeigt Items stattdessen als ganz normale Zeilen und exportiert die Abfrage hinter dem Grid als Go-Programm, das auf denselben SDK-v2-Typen aufbaut. DynoTable herunterladen.
Verwandte Beispiele
- DynamoDB GetItem in Java — derselbe Read mit AWS SDK for Java 2.x.
- DynamoDB Query in Go — eine ganze Partition lesen statt eines einzelnen Items.
- Wie DynamoDB-Partition-Keys funktionieren — warum
GetItemden vollständigen Key braucht. - DynamoDB ResourceNotFoundException — der übliche erste Fehler hier: falscher Tabellenname oder falsche Region.
- "The provided key element does not match the schema" — der übergebene Key passt nicht zum Key-Schema der Tabelle.
Referenzen
- GetItem — Amazon DynamoDB API Reference
- Use GetItem with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- dynamodb package — AWS SDK for Go v2 (pkg.go.dev)
- dynamodb/types package — AWS SDK for Go v2 (pkg.go.dev)
- attributevalue package — AWS SDK for Go v2 (pkg.go.dev)
- Read consistency — Amazon DynamoDB Developer Guide
Zuletzt verifiziert am 2026-07-28 gegen die oben verlinkte offizielle AWS-Dokumentation.