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 deAttributeValueMemberN({Value: "1994"}).- L'insertion remplace — sans condition,
PutItemécrase silencieusement un élément existant ayant la même clé. UtiliseUpdateItempour modifier quelques attributs sans écraser le reste. ConditionExpression—attribute_not_exists(...)sur les attributs de clé fait de l'écriture une insertion de création uniquement ; l'écriture échoue avecConditionalCheckFailedExceptionsi l'élément existe déjà. C'est la primitive de verrouillage optimiste de DynamoDB. Les alias#cond0/#cond1se résolvent enArtist/SongTitleviaExpressionAttributeNames(à l'abri des mots réservés).errors.As— le SDK Go enveloppe les erreurs de service, donc capte le type*types.ConditionalCheckFailedExceptionavecerrors.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
- DynamoDB PutItem en Java — la même écriture conditionnelle avec l'AWS SDK for Java 2.x.
- DynamoDB UpdateItem en Go — modifier des attributs spécifiques au lieu de remplacer l'élément.
- Expressions de condition DynamoDB —
attribute_not_exists, verrouillage optimiste, et plus encore. - DynamoDB ConditionalCheckFailedException — ce que lève la condition de création uniquement quand l'élément existe déjà.
- DynamoDB ValidationException — le fourre-tout pour un élément ou une expression malformés.
References
- PutItem — Amazon DynamoDB API Reference
- Use PutItem 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)
- Handling errors — AWS SDK for Go v2 Developer Guide
- Condition expressions — Amazon DynamoDB Developer Guide
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.