удалить все элементы DynamoDB с помощью Python - PullRequest
0 голосов
/ 14 марта 2019

Как я могу удалить все элементы из DynamoDB, используя python (boto3)?

Я пытаюсь сделать это:

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

Ответы [ 3 ]

1 голос
/ 15 марта 2019

Используйте BatchWriteItem. Документация гласит

Операция BatchWriteItem помещает или удаляет несколько элементов в одной или нескольких таблицах. Один вызов BatchWriteItem может записать до 16 МБ данных, которые могут содержать до 25 запросов на установку или удаление. Отдельные записываемые элементы могут достигать 400 КБ.

Я предполагаю, что в Boto3 API это тоже есть, но может иметь другое имя.

0 голосов
/ 16 июня 2019

Вот ответ, который учитывает тот факт, что вы можете не получить все записи обратно при первом вызове, если вы пытаетесь усечь большую таблицу (или меньшую таблицу с большими элементами). Предполагается, что вы используете только HashKey (называемый id), поэтому вам придется добавить бит к вашим вызовам ProjectionExpression и delete_item, если у вас также есть SortKey на вашем столе.

Там есть кое-что еще, что вы можете вырезать, просто печатая счетчик на стандартный вывод, чтобы мы, люди, были счастливы.

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
0 голосов
/ 28 марта 2019

Я нашел решение!Я просто монтирую ключ со своим идентификатором таблицы и идентификатором поиска (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']
            }
        )
...