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,所以拼错是编译错误,而不是运行时的ValidationException。DeleteItem只接受NONE和ALL_OLD;枚举的其余取值是和UpdateItem共用的。len(out.Attributes) == 0是你能拿到的唯一信号——删除一个从来不存在的键也会成功,而且 SDK 返回的是一个 nil map,不是错误。除此之外没有任何东西能区分"删掉了"和"本来就没东西可删"。- 用
errors.As来匹配防护失败——先var ccfe *types.ConditionalCheckFailedException,再errors.As(err, &ccfe)。直接比较会漏掉它,因为 Go v2 会把服务端故障包在一个 Smithy 操作错误里。 - 异常可以带上那个失败的项——设置
ReturnValuesOnConditionCheckFailure: types.ReturnValuesOnConditionCheckFailureAllOld,ccfe.Item里就是 DynamoDB 眼中的那一行,于是你可以把真正没通过防护的值记下来,而不用再读一次。SDK 也写明了代价:"No read capacity units are consumed." - 一次调用只处理一个项——没有删除全部的 API。删除多个项意味着先收集键再批量写,或者干脆把表删掉。
用可视化的方式来做
麻烦的是防护那一半:一个 ConditionExpression,外加配套的名字映射和值映射。DynamoDB 表达式构建器能从一个表单里把这三样都拼出来。
DynoTable 是从另一头对付同一个风险的。删除会先落进"待提交更改"面板,只有当你提交时才真正到达表里,于是删错的那一行是你可以丢弃的东西,而不是需要恢复的东西。下载 DynoTable。
相关示例
- Java 中的 DynamoDB DeleteItem——用 AWS SDK for Java 2.x 实现同一个删除。
- Go 中的 DynamoDB PutItem——同一个键的写入侧。
- DynamoDB 条件表达式——用
attribute_exists和值检查给删除加防护。 - DynamoDB ConditionalCheckFailedException——条件删除失败时抛出什么,以及什么时候这是预期之内的。
参考资料
- 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
最后核实于 2026-07-28,依据上方链接的 AWS 官方文档。