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 pointeursTableName, ProjectionExpression et ConsistentRead sont des *string et *bool pour que le SDK distingue « non défini » de la valeur zéro. aws.String, aws.Bool et aws.Int32 n'existent que pour ça.
  • Les nombres arrivent sous forme de chaînesAttributeValueMemberN.Value est un string, parce que DynamoDB transporte les nombres comme des chaînes. Lire Year signifie out.Item["Year"].(*types.AttributeValueMemberN) puis strconv.Atoi. Utilise la forme comma-ok de l'assertion ; la forme nue panique quand l'attribut est absent ou d'un autre type.
  • attributevalue.UnmarshalMap est la porte de sortie — issu de github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue, il projette l'élément entier sur un struct doté de tags dynamodbav et effectue la conversion chaîne-vers-nombre. À sortir dès qu'un élément dépasse deux ou trois attributs.
  • out.Item vaut nil quand rien n'est trouvé, et err aussi. len(out.Item) == 0 couvre à 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, donc err == … et la comparaison de chaînes sur err.Error() échouent silencieusement l'un comme l'autre. Déclare var nf *types.ResourceNotFoundException et passe son adresse.
  • ConsistentRead: aws.Bool(true) double le coût de lecture et est rejeté sur un GSI. Les alias #proj ci-dessus ne sont pas décoratifs non plus : Year est 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

Références

Dernière vérification le 2026-07-28 par rapport à la documentation officielle AWS liée ci-dessus.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.