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 が受け付けるのは NONEALL_OLD だけで、列挙型の残りUpdateItem と共有されています。
  • 得られるシグナルは len(out.Attributes) == 0 だけです。もともと存在しなかったキーの削除も成功し、SDK はエラーではなく nil のマップを返します。「削除した」と「削除するものがなかった」を分けるものは他にありません。
  • ガードの失敗は 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."
  • 1 回の呼び出しにつき 1 アイテム。全件削除の API はありません。多数のアイテムを削除するには、まずキーを集めて書き込みをバッチにするか、テーブルごと捨てるかです。

ビジュアルに行う

面倒なのはガードの側です。ConditionExpression と、それに付随する名前と値のマップ。DynamoDB Expression Builder はその 3 つすべてをフォームから組み立てます。

DynoTable は同じリスクに反対側から取り組みます。削除はまず Pending changes パネルに入り、コミットして初めてテーブルに届くので、間違った行は復元するものではなく破棄するものになります。DynoTable をダウンロード

関連する例

参考資料

最終検証日 2026-07-28、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。