Я бы хотел "усечь" (удалить все элементы) в таблице DynamoDB. Я знаю, что наиболее эффективный способ сделать это - удалить таблицу и заново создать ее (имя, индексы и т. Д.). Однако эта таблица является частью развертывания SAM-CloudFormation. На таблицу (по имени) также ссылаются в других частях приложения.
Если бы я удалил и заново создал его, я мог бы использовать то же имя, что и раньше; однако, я думаю, что это вызовет проблемы, потому что (1) удаление не является немедленным и (2) изменится ARN, что может иметь последствия для стека CloudFormation.
Похоже, что должно быть лучшее решение, чем метод грубой силы: перебирать все элементы, удаляя их по одному (с некоторой оптимизацией через batch_writer
).
Я рассмотрел некоторые другие решения здесь, но они не затрагивают часть моего стека CloudFormation.
Я даже сам предоставил грубое решение другого вопроса по этой теме.
Вот подход грубой силы
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
Желаемым конечным состоянием является таблица DynamoDB (которая ранее была полна элементов) с тем же именем, без элементов и все еще может быть уничтожена в ходе операции удаления CloudFormation.