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 um types.ReturnValue, então um erro de digitação é erro de compilação em vez de um ValidationException em tempo de execução. O DeleteItem aceita apenas NONE e ALL_OLD; o resto do enum é compartilhado com o UpdateItem.
  • 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.Asvar ccfe *types.ConditionalCheckFailedException e depois errors.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.ReturnValuesOnConditionCheckFailureAllOld e ccfe.Item conté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

Referências

Verificado pela última vez em 2026-07-28 contra a documentação oficial da AWS vinculada acima.

Trabalhe com o DynamoDB sem o Console

Um cliente desktop rápido para DynamoDB que roda o SQL de verdade que o DynamoDB não consegue — JOINs, GROUP BY, agregações — com edição visual e um agente de IA com suas próprias chaves do Bedrock.

Teste grátis de 30 dias, sem cartão de crédito — depois o plano Grátis sem limite de tempo.