Java(AWS SDK v2)での DynamoDB DeleteItem
AWS SDK for Java 2.x での削除は、完全なプライマリキーを携えた DeleteItemRequest であり、ReturnValue.ALL_OLD がそこに本当に何かがあったのかを教えてくれます。
下のコードに conditionExpression を足すと、コンパイルは通るのにバグを抱えることになります。スニペットの下の最初の箇条書きが、そのバグです。
コード
import java.util.HashMap;
import java.util.Map;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DeleteItemRequest;
import software.amazon.awssdk.services.dynamodb.model.DeleteItemResponse;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.ReturnValue;
public class DeleteItemExample {
public static void main(String[] args) {
try (DynamoDbClient ddb = DynamoDbClient.builder()
.region(Region.US_EAST_1)
.build()) {
Map<String, AttributeValue> key = new HashMap<>();
key.put("Artist", AttributeValue.builder().s("Arturo Sandoval").build());
key.put("SongTitle", AttributeValue.builder().s("Cubano Chant").build());
DeleteItemRequest request = DeleteItemRequest.builder()
.tableName("Music")
.key(key)
.returnValues(ReturnValue.ALL_OLD)
.build();
DeleteItemResponse response = ddb.deleteItem(request);
if (response.attributes().isEmpty()) {
System.out.println("No item with that key existed");
} else {
System.out.println("Deleted: " + response.attributes());
}
} catch (DynamoDbException e) {
System.err.println(e.getMessage());
}
}
}解説
ConditionalCheckFailedExceptionはDynamoDbExceptionを継承しています — つまり上のcatchブロックは、失敗したガードを飲み込み、サービスが壊れたかのように表示します。リクエストがconditionExpressionを持つようになったら、より狭い型を先に捕捉しましょう。仕事をした条件は、エラーではなく結果です。- 例外は、負けたアイテムを携えています — リクエストに
returnValuesOnConditionCheckFailure(ReturnValuesOnConditionCheckFailure.ALL_OLD)を付けると、e.item()が DynamoDB から見えていたままの行を返します。AWS はその値段も明記しています。"No read capacity units are consumed." attributes()がnullを返すことはありません — 何にも一致しなかった削除は空のマップを返すので、判定はisEmpty()です。「サービスが何も返さなかった」と「サービスが空のマップを返した」を分けるのがhasAttributes()です。ReturnValueの enum はUpdateItemと共有されています —returnValues(ReturnValue.ALL_NEW)はここでもコンパイルが通り、ValidationExceptionとなって返ってきます。"DeleteItemdoes not recognize any values other thanNONEorALL_OLD" だからです。ビルダーのStringオーバーロードは、同じ誤りを覆い隠します(全体像)。- テーブルを空にするための API 呼び出しはありません —
DeleteItemはちょうど 1 つのキーを削除し、SDK には複数を削除するものがありません。テーブルの中身を空にするのはキーのScanとそれに続くバッチ書き込みであり、たいていDeleteTableとCreateTableの組み合わせに負けます。
ビジュアルに行う
ガードに使う属性が予約語なら、その条件には # の別名が必要です。予約語チェッカーは、自分の属性名のどれが AWS の 573 語のリストに載っているかを教え、該当するものについて expressionAttributeNames のマップを生成します。
DynoTable は、削除がテーブルに届く前に「保留中の変更」パネルへステージします。Cmd+Backspace で選択した行をステージし、Cmd+Shift+Backspace で削除とコミットを一度に行い、ステージしたものはすべて破棄できます。DynoTable をダウンロードしてください。
関連する例
- Go での DynamoDB DeleteItem — AWS SDK for Go v2 による同じ削除。
- Java での DynamoDB PutItem — 同じキーの書き込み側。
- DynamoDB の条件式 —
attribute_existsと値のチェックで削除をガードします。 - DynamoDB ConditionalCheckFailedException — 条件付き削除が失敗したときに送出されるもの、そしてそれが想定内である場面。
参考資料
- DeleteItem — Amazon DynamoDB API Reference
- Use DeleteItem with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- DeleteItemRequest — AWS SDK for Java 2.x API Reference
- ConditionalCheckFailedException — AWS SDK for Java 2.x API Reference
- Condition expressions — Amazon DynamoDB Developer Guide
最終検証日 2026-07-28、上記にリンクした公式 AWS ドキュメントに照らして確認しました。