如果您无法删除表格,您将需要使用BatchWriteItem。如果您的所有条目都在一个 HashKey 中,您可以使用查询 API 来检索记录,然后一次删除 25 个项目。如果没有,您可能必须扫描。
或者,您可以为AmazonDynamoDBClient(来自官方 SDK)提供一个简单的包装器,用于收集表中存在的一组哈希/范围键。然后,您无需查询或扫描您在测试后插入的项目,因为您已经构建了 Set。看起来像这样:
public class KeyCollectingAmazonDynamoDB implements AmazonDynamoDB
{
private final AmazonDynamoDB delegate;
// HashRangePair is something you have to define
private final Set<Key> contents;
public InsertGatheringAmazonDynamoDB( AmazonDynamoDB delegate )
{
this.delegate = delegate;
this.contents = new HashSet<>();
}
@Override
public PutItemResult putItem( PutItemRequest putItemRequest )
throws AmazonServiceException, AmazonClientException
{
contents.add( extractKey( putItemRequest.getItem() ) );
return delegate.putItem( putItemRequest );
}
private Key extractKey( Map<String, AttributeValue> item )
{
// TODO Define your hash/range key extraction here
// Create a Key object
return new Key( hashKey, rangeKey );
}
@Override
public DeleteItemResult deleteItem( DeleteItemRequest deleteItemRequest )
throws AmazonServiceException, AmazonClientException
{
contents.remove( deleteItemRequest.getKey() );
return delegate.deleteItem( deleteItemRequest );
}
@Override
public BatchWriteItemResult batchWriteItem( BatchWriteItemRequest batchWriteItemRequest )
throws AmazonServiceException, AmazonClientException
{
// Similar extraction, but in bulk.
for ( Map.Entry<String, List<WriteRequest>> entry : batchWriteItemRequest.getRequestItems().entrySet() )
{
String tableName = entry.getKey();
List<WriteRequest> writeRequests = entry.getValue();
for ( WriteRequest writeRequest : writeRequests )
{
PutRequest putRequest = writeRequest.getPutRequest();
if ( putRequest != null )
{
// Add to Set just like putItem
}
DeleteRequest deleteRequest = writeRequest.getDeleteRequest();
if ( deleteRequest != null )
{
// Remove from Set just like deleteItem
}
}
}
// Write through to DynamoDB
return delegate.batchWriteItem( batchWriteItemRequest );
}
// remaining methods elided, since they're direct delegation
}
Key 是DynamoDB SDK 中的一个类,它在构造函数中接受零个、一个或两个AttributeValue 对象来表示哈希键或哈希/范围键。假设它的 equals 和 hashCode 方法有效,您可以在我描述的 Set 中使用。如果他们不这样做,您将不得不编写自己的 Key 类。
这应该会为您提供一个维护的 Set 以在您的测试中使用。它不是特定于表的,因此如果您使用多个表,则可能需要添加另一层集合。这会将Set<Key> 更改为Map<TableName, Set<Key>>。您需要查看 getTableName() 属性以选择正确的 Set 进行更新。
测试完成后,获取表格内容并删除应该很简单。
最后一个建议:使用与应用程序不同的表进行测试。创建一个相同的模式,但给表一个不同的名称。您甚至可能需要不同的 IAM 用户来阻止您的测试代码访问您的生产表。如果您对此有任何疑问,请随时针对该场景提出单独的问题。