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 un types.ReturnValue, quindi un refuso è un errore di compilazione invece di una ValidationException a runtime. DeleteItem accetta solo NONE e ALL_OLD; il resto dell'enum è condiviso con UpdateItem.
  • 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.Asvar ccfe *types.ConditionalCheckFailedException e poi errors.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.ReturnValuesOnConditionCheckFailureAllOld e ccfe.Item contiene 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

Riferimenti

Ultima verifica 2026-07-28 rispetto alla documentazione ufficiale AWS collegata sopra.

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.