DeleteItem de DynamoDB en Go (SDK de AWS v2)

client.DeleteItem recibe un dynamodb.DeleteItemInput que lleva la clave principal completa. Con types.ReturnValueAllOld la respuesta te dice si había algo ahí realmente; en cuanto añades una ConditionExpression, el error te dice por qué se quedó.

Código

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)
	}
}

Explicación

  • types.ReturnValueAllOld es una constante tipada, no la cadena "ALL_OLD" — el campo toma un types.ReturnValue, así que una errata es un error de compilación en lugar de un ValidationException en ejecución. DeleteItem solo acepta NONE y ALL_OLD; el resto del enum se comparte con UpdateItem.
  • len(out.Attributes) == 0 es la única señal que obtienes — borrar una clave que nunca estuvo ahí tiene éxito, y el SDK devuelve un mapa nil en vez de un error. Nada más separa «lo borré» de «no había nada que borrar».
  • Empareja el fallo de la guarda con errors.Asvar ccfe *types.ConditionalCheckFailedException y luego errors.As(err, &ccfe). Una comparación directa no lo detecta, porque Go v2 envuelve los fallos de servicio en un error de operación de Smithy.
  • La excepción puede llevar el Item que perdió — fija ReturnValuesOnConditionCheckFailure: types.ReturnValuesOnConditionCheckFailureAllOld y ccfe.Item contiene la fila tal como la vio DynamoDB, así que puedes registrar el valor que realmente falló la guarda en vez de releerlo. El SDK documenta el precio: "No read capacity units are consumed."
  • Un Item por llamada — no hay API de borrado masivo. Borrar muchos Items significa recopilar primero las claves y agrupar las escrituras, o eliminar la tabla.

Hazlo visualmente

La guarda es la mitad delicada: una ConditionExpression más los mapas de nombres y valores que la acompañan. El DynamoDB Expression Builder ensambla los tres desde un formulario.

DynoTable ataca el mismo riesgo por el otro extremo. Un borrado aterriza primero en un panel de cambios pendientes y solo llega a la tabla cuando lo confirmas, así que una fila equivocada es algo que descartas en lugar de algo que restauras. Descarga DynoTable.

Ejemplos relacionados

Referencias

Verificado por última vez el 2026-07-28 contra la documentación oficial de AWS enlazada arriba.

Trabaja con DynamoDB sin la Consola

Un cliente de escritorio rápido para DynamoDB que ejecuta el SQL real que DynamoDB no puede — JOINs, GROUP BY, agregaciones — con edición visual y un agente de IA con tus propias claves de Bedrock.

Prueba gratuita de 30 días, sin tarjeta — después, el plan Free sin límite de tiempo.