使用 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

原文由 Dansp 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 720
2 个回答

我找到了解决办法!我只是用我的表 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']
            }
        )

原文由 Dansp 发布,翻译遵循 CC BY-SA 4.0 许可协议

虽然我同意删除表并重新创建它的效率要高得多,但可能会有这样的情况,例如当许多 GSI 或触发器事件与表相关联并且您不想重新关联它们时。下面的脚本将遍历扫描以处理大型表(每次扫描调用将返回 1Mb 的键值)并使用批处理函数删除表中的所有项目。

 import boto3
dynamo = boto3.resource('dynamodb')

def truncateTable(tableName):
    table = dynamo.Table(tableName)

    #get the table keys
    tableKeyNames = [key.get("AttributeName") for key in table.key_schema]

    #Only retrieve the keys for each item in the table (minimize data transfer)
    projectionExpression = ", ".join('#' + key for key in tableKeyNames)
    expressionAttrNames = {'#'+key: key for key in tableKeyNames}

    counter = 0
    page = table.scan(ProjectionExpression=projectionExpression, ExpressionAttributeNames=expressionAttrNames)
    with table.batch_writer() as batch:
        while page["Count"] > 0:
            counter += page["Count"]
            # Delete items in batches
            for itemKeys in page["Items"]:
                batch.delete_item(Key=itemKeys)
            # Fetch the next page
            if 'LastEvaluatedKey' in page:
                page = table.scan(
                    ProjectionExpression=projectionExpression, ExpressionAttributeNames=expressionAttrNames,
                    ExclusiveStartKey=page['LastEvaluatedKey'])
            else:
                break
    print(f"Deleted {counter}")

truncateTable("YOUR_TABLE_NAME")

原文由 Ethan Harris 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题