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.ReturnValueAllOldes una constante tipada, no la cadena"ALL_OLD"— el campo toma untypes.ReturnValue, así que una errata es un error de compilación en lugar de unValidationExceptionen ejecución.DeleteItemsolo aceptaNONEyALL_OLD; el resto del enum se comparte conUpdateItem.len(out.Attributes) == 0es 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.As—var ccfe *types.ConditionalCheckFailedExceptiony luegoerrors.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.ReturnValuesOnConditionCheckFailureAllOldyccfe.Itemcontiene 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
- DeleteItem de DynamoDB en Java — el mismo borrado con el SDK de AWS para Java 2.x.
- PutItem de DynamoDB en Go — el lado de escritura de la misma clave.
- Expresiones de condición de DynamoDB — protege los borrados con
attribute_existsy comprobaciones de valor. - DynamoDB ConditionalCheckFailedException — qué lanza un borrado condicional fallido y cuándo es esperado.
Referencias
- 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
Verificado por última vez el 2026-07-28 contra la documentación oficial de AWS enlazada arriba.