Go(AWS SDK v2)中的 DynamoDB DeleteItem
client.DeleteItem 接受一個帶有完整 primary key 的 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 Expression Builder 會從表單把這三者一起組出來。
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 官方文件。