DynamoDB PutItem en Go (AWS SDK v2)

PutItem écrit un élément entier, en le créant ou en remplaçant tout élément existant ayant la même clé primaire. Dans l'AWS SDK for Go v2 tu appelles client.PutItem avec un dynamodb.PutItemInput dont la carte Item contient chaque attribut comme valeur typée du package types.

Code

package main

import (
	"context"
	"errors"
	"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)

	_, err = client.PutItem(ctx, &dynamodb.PutItemInput{
		TableName: aws.String("Music"),
		Item: map[string]types.AttributeValue{
			"Artist":     &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
			"SongTitle":  &types.AttributeValueMemberS{Value: "Cubano Chant"},
			"AlbumTitle": &types.AttributeValueMemberS{Value: "Danzon"},
			"Year":       &types.AttributeValueMemberN{Value: "1994"},
			"Awards":     &types.AttributeValueMemberN{Value: "0"},
		},
		ConditionExpression: aws.String("attribute_not_exists(#cond0) AND attribute_not_exists(#cond1)"),
		ExpressionAttributeNames: map[string]string{
			"#cond0": "Artist",
			"#cond1": "SongTitle",
		},
	})
	if err != nil {
		var ccf *types.ConditionalCheckFailedException
		if errors.As(err, &ccf) {
			fmt.Println("A song with that key already exists — not overwritten")
			return
		}
		log.Fatalf("put item: %v", err)
	}
	fmt.Println("Song written")
}

Pour construire la carte Item à partir d'une structure Go simple, utilise plutôt attributevalue.MarshalMap de github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue.

Explication

  • Item — doit contenir la clé primaire complète de la table, plus tout autre attribut. Les nombres sont des chaînes à l'intérieur de AttributeValueMemberN ({Value: "1994"}).
  • L'insertion remplace — sans condition, PutItem écrase silencieusement un élément existant ayant la même clé. Utilise UpdateItem pour modifier quelques attributs sans écraser le reste.
  • ConditionExpressionattribute_not_exists(...) sur les attributs de clé fait de l'écriture une insertion de création uniquement ; l'écriture échoue avec ConditionalCheckFailedException si l'élément existe déjà. C'est la primitive de verrouillage optimiste de DynamoDB. Les alias #cond0/#cond1 se résolvent en Artist/SongTitle via ExpressionAttributeNames (à l'abri des mots réservés).
  • errors.As — le SDK Go enveloppe les erreurs de service, donc capte le type *types.ConditionalCheckFailedException avec errors.As, jamais par comparaison de chaînes.
  • Pour récupérer l'élément écrasé, définis ReturnValues: types.ReturnValueAllOld.

À faire visuellement

Tu écris une insertion conditionnelle à la main ? Le DynamoDB Expression Builder assemble le ConditionExpression et copie le code.

Pour ajouter et éditer des éléments dans une interface graphique — un formulaire par attribut, des sélecteurs de type, et copie en tant que code — télécharge DynoTable.

Exemples liés

References

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

Travaille avec DynamoDB sans la Console

DynoTable est un client de bureau rapide pour DynamoDB — parcours les tables, exécute des requêtes de style SQL et édite les items en local.