Go(AWS SDK v2)中的 DynamoDB DeleteItem

client.DeleteItem 接收一个携带完整主键dynamodb.DeleteItemInput。用上 types.ReturnValueAllOld,响应会告诉你那里到底有没有东西;一旦再加上 ConditionExpression,错误就会告诉你它为什么还留着。

代码

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

说明

  • types.ReturnValueAllOld 是一个带类型的常量,不是字符串 "ALL_OLD"——这个字段的类型是 types.ReturnValue,所以拼错是编译错误,而不是运行时的 ValidationExceptionDeleteItem 只接受 NONEALL_OLD枚举的其余取值是和 UpdateItem 共用的。
  • len(out.Attributes) == 0 是你能拿到的唯一信号——删除一个从来不存在的键也会成功,而且 SDK 返回的是一个 nil map,不是错误。除此之外没有任何东西能区分"删掉了"和"本来就没东西可删"。
  • errors.As 来匹配防护失败——先 var ccfe *types.ConditionalCheckFailedException,再 errors.As(err, &ccfe)。直接比较会漏掉它,因为 Go v2 会把服务端故障包在一个 Smithy 操作错误里。
  • 异常可以带上那个失败的项——设置 ReturnValuesOnConditionCheckFailure: types.ReturnValuesOnConditionCheckFailureAllOldccfe.Item 里就是 DynamoDB 眼中的那一行,于是你可以把真正没通过防护的值记下来,而不用再读一次。SDK 也写明了代价:"No read capacity units are consumed."
  • 一次调用只处理一个项——没有删除全部的 API。删除多个项意味着先收集键再批量写,或者干脆把表删掉。

用可视化的方式来做

麻烦的是防护那一半:一个 ConditionExpression,外加配套的名字映射和值映射。DynamoDB 表达式构建器能从一个表单里把这三样都拼出来。

DynoTable 是从另一头对付同一个风险的。删除会先落进"待提交更改"面板,只有当你提交时才真正到达表里,于是删错的那一行是你可以丢弃的东西,而不是需要恢复的东西。下载 DynoTable

相关示例

参考资料

最后核实于 2026-07-28,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。