GetItem DynamoDB en Go (AWS SDK v2)
Dans l'AWS SDK for Go v2, un élément est une map[string]types.AttributeValue, et types.AttributeValue est une interface scellée : les seules implémentations sont les dix structs AttributeValueMember* livrés par le SDK. Écrire une clé avec elles est facile. C'est à la relecture des valeurs que Go diverge de tous les autres SDK.
client.GetItem veut toujours la clé primaire complète, comme partout ailleurs.
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)
}Explication
- Les scalaires sont des pointeurs —
TableName,ProjectionExpressionetConsistentReadsont des*stringet*boolpour que le SDK distingue « non défini » de la valeur zéro.aws.String,aws.Booletaws.Int32n'existent que pour ça. - Les nombres arrivent sous forme de chaînes —
AttributeValueMemberN.Valueest unstring, parce que DynamoDB transporte les nombres comme des chaînes. LireYearsignifieout.Item["Year"].(*types.AttributeValueMemberN)puisstrconv.Atoi. Utilise la forme comma-ok de l'assertion ; la forme nue panique quand l'attribut est absent ou d'un autre type. attributevalue.UnmarshalMapest la porte de sortie — issu degithub.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue, il projette l'élément entier sur un struct doté de tagsdynamodbavet effectue la conversion chaîne-vers-nombre. À sortir dès qu'un élément dépasse deux ou trois attributs.out.Itemvautnilquand rien n'est trouvé, eterraussi.len(out.Item) == 0couvre à la fois nil et vide si tu n'as pas besoin de les distinguer.- Compare les erreurs avec
errors.As— Go v2 enveloppe les fautes de service dans une erreur d'opération Smithy, doncerr == …et la comparaison de chaînes surerr.Error()échouent silencieusement l'un comme l'autre. Déclarevar nf *types.ResourceNotFoundExceptionet passe son adresse. ConsistentRead: aws.Bool(true)double le coût de lecture et est rejeté sur un GSI. Les alias#projci-dessus ne sont pas décoratifs non plus :Yearest un mot réservé, et une projection qui le nomme directement est refusée.
Le faire visuellement
Traduire entre la forme AttributeValueMember* et du JSON ordinaire est un impôt permanent en Go. Le convertisseur DynamoDB JSON fait cet aller-retour dans le navigateur quand tu n'as qu'un élément à lire ou à coller.
DynoTable affiche plutôt les éléments comme des lignes ordinaires, et exporte la requête derrière la grille sous forme de programme Go bâti sur ces mêmes types du SDK v2. Télécharger DynoTable.
Exemples liés
- GetItem DynamoDB en Java — la même lecture avec l'AWS SDK for Java 2.x.
- Query DynamoDB en Go — lire toute une partition plutôt qu'un seul élément.
- Comment fonctionnent les clés de partition DynamoDB — pourquoi
GetItema besoin de la clé complète. - DynamoDB ResourceNotFoundException — la première erreur habituelle ici : mauvais nom de table ou mauvaise région.
- "The provided key element does not match the schema" — la clé que tu passes ne correspond pas au schéma de clé de la table.
Références
- 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
Dernière vérification le 2026-07-28 par rapport à la documentation officielle AWS liée ci-dessus.