DeleteItem DynamoDB in Go (AWS SDK v2)
client.DeleteItem prende un dynamodb.DeleteItemInput che porta la chiave primaria completa. Con types.ReturnValueAllOld la risposta ti dice se c'era davvero qualcosa; appena aggiungi una ConditionExpression, è l'errore a dirti perché è rimasto.
Codice
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.DeleteItem(ctx, &dynamodb.DeleteItemInput{
TableName: aws.String("Music"),
Key: map[string]types.AttributeValue{
"Artist": &types.AttributeValueMemberS{Value: "Arturo Sandoval"},
"SongTitle": &types.AttributeValueMemberS{Value: "Cubano Chant"},
},
ReturnValues: types.ReturnValueAllOld,
})
if err != nil {
log.Fatalf("delete item: %v", err)
}
if len(out.Attributes) == 0 {
fmt.Println("No item with that key existed")
} else {
fmt.Println("Deleted:", out.Attributes)
}
}Spiegazione
types.ReturnValueAllOldè una costante tipizzata, non la stringa"ALL_OLD"— il campo prende untypes.ReturnValue, quindi un refuso è un errore di compilazione invece di unaValidationExceptiona runtime.DeleteItemaccetta soloNONEeALL_OLD; il resto dell'enum è condiviso conUpdateItem.len(out.Attributes) == 0è l'unico segnale che ottieni — eliminare una chiave che non c'è mai stata riesce, e l'SDK restituisce una mappa nil invece di un errore. Nient'altro distingue "l'ho eliminato" da "non c'era nulla da eliminare".- Intercetta il fallimento della guardia con
errors.As—var ccfe *types.ConditionalCheckFailedExceptione poierrors.As(err, &ccfe). Un confronto diretto lo manca, perché Go v2 avvolge i fault di servizio in un operation error Smithy. - L'eccezione può portare l'Item perdente — imposta
ReturnValuesOnConditionCheckFailure: types.ReturnValuesOnConditionCheckFailureAllOldeccfe.Itemcontiene la riga come l'ha vista DynamoDB, così puoi loggare il valore che ha davvero fallito la guardia invece di rileggerlo. L'SDK documenta il prezzo: "No read capacity units are consumed." - Un Item per chiamata — non esiste un'API di delete-all. Eliminare molti Item significa raccogliere prima le chiavi e raggruppare le scritture in batch, oppure eliminare la tabella.
Fallo visivamente
La guardia è la metà più fastidiosa: una ConditionExpression più le mappe di nomi e valori che la accompagnano. Il DynamoDB Expression Builder assembla tutte e tre da un modulo.
DynoTable affronta lo stesso rischio dall'altro lato. Un'eliminazione finisce prima in un pannello Modifiche in sospeso e raggiunge la tabella solo quando la committi, quindi una riga sbagliata è qualcosa che scarti invece di qualcosa che devi ripristinare. Scarica DynoTable.
Esempi correlati
- DeleteItem DynamoDB in Java — la stessa eliminazione con AWS SDK for Java 2.x.
- PutItem DynamoDB in Go — il lato scrittura della stessa chiave.
- Espressioni di condizione DynamoDB — proteggi le eliminazioni con
attribute_existse controlli sui valori. - DynamoDB ConditionalCheckFailedException — cosa solleva un'eliminazione condizionale fallita, e quando è prevista.
Riferimenti
- DeleteItem — Amazon DynamoDB API Reference
- Use DeleteItem 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)
- Condition expressions — Amazon DynamoDB Developer Guide
Ultima verifica 2026-07-28 rispetto alla documentazione ufficiale AWS collegata sopra.