web-dev-qa-db-ja.com

Pythonを使用してDynamoDBのすべてのアイテムを削除します

python(boto3))を使用してDynamoDBからすべてのアイテムを削除するにはどうすればよいですか?

私はそうしようとしています:

scan = table.scan()
with table.batch_writer() as batch:
  for each in scan['Items']:
    batch.delete_item(Key=each)

しかし、私にこのエラーを与えてください:

botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the BatchWriteItem operation: The provided key element does not match the schema
5
Daniel Pereira

解決策を見つけました!テーブルIDを使用してキーをマウントし、ID(compId)を検索するだけです。

scan = table.scan()
with table.batch_writer() as batch:
    for each in scan['Items']:
        batch.delete_item(
            Key={
                'uId': each['uId'],
                'compId': each['compId']
            }
        )
6
Daniel Pereira

大きなテーブル(または大きなアイテムを含む小さなテーブル)を切り詰めようとすると、最初の呼び出しですべてのレコードが返されない可能性があるという事実を考慮した答えがここにあります。これは、HashKey(idと呼ばれる)のみを使用していると想定しているため、SortKeyも持っている場合は、ProjectionExpressionおよびdelete_item呼び出しにビットを追加する必要がありますテーブル。

そこには、人間を幸せにするためにstdoutにカウンターを出力するだけの余分なものがあります。

import boto3

table = boto3.resource('dynamodb').Table('my-table-name')
scan = None

with table.batch_writer() as batch:
    count = 0
    while scan is None or 'LastEvaluatedKey' in scan:
        if scan is not None and 'LastEvaluatedKey' in scan:
            scan = table.scan(
                ProjectionExpression='id',
                ExclusiveStartKey=scan['LastEvaluatedKey'],
            )
        else:
            scan = table.scan(ProjectionExpression='id')

        for item in scan['Items']:
            if count % 5000 == 0:
                print(count)
            batch.delete_item(Key={'id': item['id']})
            count = count + 1
6
Matt

BatchWriteItemを使用します。 ドキュメント の状態

BatchWriteItemオペレーションは、1つ以上のテーブルの複数のアイテムを配置または削除します。 BatchWriteItemへの1回の呼び出しで、最大16 MBのデータを書き込むことができます。これには、25ものputまたはdeleteリクエストを含めることができます。書き込まれる個々の項目は、400 KBまで大きくなることがあります。

Boto3 APIにもこれがあると思いますが、名前が異なる場合があります。

1
kaskelotti