删除亚马逊dynamodb

ram*_*aaa 20 amazon-web-services amazon-dynamodb

有没有任何有效的方法可以立即从亚马逊dynamodb tabe中删除所有项目.我已经浏览了aws文档但是它显示了删除单个项目.

Iht*_*has 13

执行以下步骤:

  1. 制作删除表格请求
  2. 在响应中,您将获得TableDescription
  3. 使用TableDescription再次创建表.

对于步骤1和2,请单击此处

对于第3步,请单击此处

这就是我在我的应用程序中所做的.


Tre*_*son 6

正如 ihtsham 所说,最有效的方法是删除并重新创建表。但是,如果这不切实际(例如,由于表的复杂配置,例如 Lambda 触发器),这里有一些 AWS CLI 命令来删除所有记录。他们需要jq用于 JSON 处理的程序。

一一删除记录(慢!),假设你的表被调用my_table,你的分区键被调用partition_key,你的排序键(如果有)被调用sort_key

aws dynamodb scan --table-name my_table | \
  jq -c '.Items[] | { partition_key, sort_key }' | \
  tr '\n' '\0' | \
  xargs -0 -n1 -t aws dynamodb delete-item --table-name my_table --key
Run Code Online (Sandbox Code Playgroud)

批量删除最多25条记录:

aws dynamodb scan --table-name my_table | \
  jq -c '[.Items | keys[] as $i | { index: $i, value: .[$i]}] | group_by(.index / 25 | floor)[] | { "my_table": [.[].value | { "DeleteRequest": { "Key": { partition_key, sort_key }}}] }' | \
  tr '\n' '\0' | \
  xargs -0 -n1 -t aws dynamodb batch-write-item --request-items
Run Code Online (Sandbox Code Playgroud)

如果您开始看到非空UnprocessedItems响应,则表示已超出您的写入容量。您可以通过减少批量大小来解决这个问题。对我来说,每批提交大约需要一秒钟,因此在每秒 5 次写入容量的情况下,我将批大小设置为 5。


小智 5

DynamoDBMapper将在以下几行中完成工作:

AWSCredentials credentials = new PropertiesCredentials(credentialFile);
client = new AmazonDynamoDBClient(credentials);
DynamoDBMapper mapper = new DynamoDBMapper(this.client);
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
PaginatedScanList<LogData> result = mapper.scan(LogData.class,  scanExpression);
for (LogData data : result) {
    mapper.delete(data);
}
Run Code Online (Sandbox Code Playgroud)


Att*_*nyi 5

只是为了记录,在Python 3中使用逐项删除的快速解决方案(使用Boto3scan()):( 需要设置凭据.)

def delete_all_items(table_name):
    # Deletes all items from a DynamoDB table.
    # You need to confirm your intention by pressing Enter.
    import boto3
    client = boto3.client('dynamodb')
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table(table_name)
    response = client.describe_table(TableName=table_name)
    keys = [k['AttributeName'] for k in response['Table']['KeySchema']]
    response = table.scan()
    items = response['Items']
    number_of_items = len(items)
    if number_of_items == 0:  # no items to delete
        print("Table '{}' is empty.".format(table_name))
        return
    print("You are about to delete all ({}) items from table '{}'."
          .format(number_of_items, table_name))
    input("Press Enter to continue...")
    with table.batch_writer() as batch:
        for item in items:
            key_dict = {k: item[k] for k in keys}
            print("Deleting " + str(item) + "...")
            batch.delete_item(Key=key_dict)

delete_all_items("test_table")
Run Code Online (Sandbox Code Playgroud)

显然,这不应该用于包含大量项目的表.(100+)为此,删除/重新创建方法更便宜,更有效.


Ste*_*ood 4

如果无法删除表,您将需要使用BatchWriteItem 。如果您的所有条目都在一个 HashKey 中,您可以使用查询 API 检索记录,然后一次删除 25 项。如果没有,您可能需要扫描。

或者,您可以提供一个简单的包装器AmazonDynamoDBClient(来自官方 SDK)来收集表中存在的一组哈希/范围键。然后,您不需要查询或扫描测试后插入的项目,因为您已经构建了集合。那看起来像这样:

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
}
Run Code Online (Sandbox Code Playgroud)

Key是DynamoDB SDK中的一个类,它在构造函数中接受零个、一个或两个AttributeValue对象来表示哈希键或哈希/范围键。假设它equalshashCode方法有效,您可以在我描述的范围内使用Set。如果他们不这样做,你就必须编写自己的Key类。

这应该会为您提供一个可在测试中使用的维护集。它并不特定于表,因此如果您使用多个表,您可能需要添加另一层集合。那会变成Set<Key>类似的东西Map<TableName, Set<Key>>。您需要查看该getTableName()属性以选择正确Set的更新。

测试完成后,获取表的内容并删除应该很简单。

最后一个建议:使用与应用程序不同的表进行测试。创建相同的架构,但为表指定不同的名称。您甚至可能需要不同的 IAM 用户来阻止您的测试代码访问您的生产表。如果您对此有疑问,请随时针对该场景提出一个单独的问题。