【发布时间】:2019-10-30 04:17:27
【问题描述】:
我想在 DynamoDB 表中“截断”(删除所有项目)。我知道最有效的方法是删除表并重新创建它(名称、索引等)。但是,该表是 SAM-CloudFormation 部署的一部分。该表(按名称)也在应用程序的其他部分中被引用。
如果我删除并重新创建它,我可以使用以前的相同名称;但是,我认为这会导致问题,因为 (1) 删除不是立即的,并且 (2) ARN 会发生变化,这可能会对 CloudFormation 堆栈产生影响。
似乎应该有比蛮力方法更好的解决方案:遍历所有项目,一次删除一个(通过batch_writer 进行一些优化)。
我在这里查看了其他一些解决方案,但它们没有解决我的问题的“CloudFormation 堆栈的一部分”部分。
- Truncate DynamoDb or rewrite data via Data Pipeline
- What is the recommended way to delete a large number of items from DynamoDB?
我什至自己为别人关于这个主题的问题提供了一个蛮力解决方案。
这是蛮力方法
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 删除操作的一部分被销毁。
【问题讨论】:
-
确保使用
ConsistentRead: True进行扫描一致,否则如果在批量写入删除后扫描速度足够快,您可能会重复获得相同的项目。
标签: python amazon-web-services amazon-dynamodb amazon-cloudformation