DeleteItem do DynamoDB em Go (AWS SDK v2)
O client.DeleteItem recebe um dynamodb.DeleteItemInput que carrega a chave primária completa. Com types.ReturnValueAllOld a resposta te diz se havia mesmo alguma coisa lá; assim que você adiciona uma ConditionExpression, o erro te diz por que o item continuou lá.
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)
}
}Explicação
types.ReturnValueAllOldé uma constante tipada, não a string"ALL_OLD"— o campo recebe umtypes.ReturnValue, então um erro de digitação é erro de compilação em vez de umValidationExceptionem tempo de execução. ODeleteItemaceita apenasNONEeALL_OLD; o resto do enum é compartilhado com oUpdateItem.len(out.Attributes) == 0é o único sinal que você recebe — excluir uma chave que nunca existiu tem sucesso, e o SDK devolve um mapa nil em vez de um erro. Nada mais separa "excluí" de "não havia nada para excluir".- Identifique a falha da proteção com
errors.As—var ccfe *types.ConditionalCheckFailedExceptione depoiserrors.As(err, &ccfe). Uma comparação direta não pega, porque o Go v2 embrulha falhas de serviço em um erro de operação do Smithy. - A exceção pode carregar o item perdedor — defina
ReturnValuesOnConditionCheckFailure: types.ReturnValuesOnConditionCheckFailureAllOldeccfe.Itemcontém a linha como o DynamoDB a viu, então você pode logar o valor que de fato falhou na proteção em vez de relê-lo. O SDK documenta o preço: "No read capacity units are consumed." - Um item por chamada — não existe API de excluir tudo. Excluir muitos itens significa coletar as chaves primeiro e agrupar as escritas em lotes, ou descartar a tabela.
Faça isso visualmente
A proteção é a metade chata: uma ConditionExpression mais os mapas de nomes e valores que a acompanham. O DynamoDB Expression Builder monta os três a partir de um formulário.
O DynoTable ataca o mesmo risco pelo outro lado. Uma exclusão cai primeiro em um painel de alterações pendentes e só chega à tabela quando você faz o commit, então uma linha errada é algo que você descarta em vez de algo que você restaura. Baixe o DynoTable.
Exemplos relacionados
- DeleteItem do DynamoDB em Java — a mesma exclusão com o AWS SDK for Java 2.x.
- PutItem do DynamoDB em Go — o lado da escrita da mesma chave.
- Expressões de condição do DynamoDB — proteja exclusões com
attribute_existse verificações de valor. - DynamoDB ConditionalCheckFailedException — o que uma exclusão condicional que falha lança, e quando isso é esperado.
Referências
- 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 pela última vez em 2026-07-28 contra a documentação oficial da AWS vinculada acima.