Go(AWS SDK v2)中的 DynamoDB DeleteItem

client.DeleteItem 接受一個帶有完整 primary keydynamodb.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 Expression Builder 會從表單把這三者一起組出來。

DynoTable 從另一端對付同一個風險。刪除會先落在「待處理變更」面板裡,只有在你提交時才真正抵達表格,所以刪錯的那一列是你可以丟棄的東西,而不是你得去還原的東西。下載 DynoTable

相關範例

參考資料

最後驗證於 2026-07-28,對照上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。