Python 用boto清空DynamoDB表

Python 用boto清空DynamoDB表,python,amazon-dynamodb,boto,Python,Amazon Dynamodb,Boto,我如何用boto优化(从财务成本角度)清空DynamoDB表?(正如我们在SQL中使用语句所做的那样。) 或者boto.dynamodb2.layer1.DynamoDBConnection.delete_table()删除整个表,而boto.dynamodb2.table.delete_item()boto.dynamodb2.table.BatchTable.delete_item()删除一个表比逐个删除项效率更高。如果您能够控制截断点,那么您可以按照文档中的建议执行类似于旋转表格的操作。如

我如何用boto优化(从财务成本角度)清空DynamoDB表?(正如我们在SQL中使用语句所做的那样。)


或者
boto.dynamodb2.layer1.DynamoDBConnection.delete_table()
删除整个表,而
boto.dynamodb2.table.delete_item()
boto.dynamodb2.table.BatchTable.delete_item()
删除一个表比逐个删除项效率更高。如果您能够控制截断点,那么您可以按照文档中的建议执行类似于旋转表格的操作。

如上所述,删除表格并重新创建它比删除单个项目更有效。您应该确保您的代码在完全删除之前不会尝试创建新表

def deleteTable(table_name):
    print('deleting table')
    return client.delete_table(TableName=table_name)


def createTable(table_name):
    waiter = client.get_waiter('table_not_exists')
    waiter.wait(TableName=table_name)
    print('creating table')
    table = dynamodb.create_table(
        TableName=table_name,
        KeySchema=[
            {
                'AttributeName': 'YOURATTRIBUTENAME',
                'KeyType': 'HASH'
            }
        ],
        AttributeDefinitions= [
            {
                'AttributeName': 'YOURATTRIBUTENAME',
                'AttributeType': 'S'
            }
        ],
        ProvisionedThroughput={
            'ReadCapacityUnits': 1,
            'WriteCapacityUnits': 1
        },
        StreamSpecification={
            'StreamEnabled': False
        }
    )


def emptyTable(table_name):
    deleteTable(table_name)
    createTable(table_name)
虽然我同意删除表格并重新创建表格更为有效,但也可能存在这样的情况,例如许多GSI或TIRGER事件与表格关联,而您不想重新关联这些事件。下面的脚本应该可以递归扫描表,并使用批处理函数删除表中的所有项。但是,对于大型表,这可能不起作用,因为它需要将表中的所有项加载到计算机中

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]
    
    """
    NOTE: there are reserved attributes for key names, please see https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html
    if a hash or range key is in the reserved word list, you will need to use the ExpressionAttributeNames parameter
    described at https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Table.scan
    """

    #Only retrieve the keys for each item in the table (minimize data transfer)
    ProjectionExpression = ", ".join(tableKeyNames)
    
    response = table.scan(ProjectionExpression=ProjectionExpression)
    data = response.get('Items')
    
    while 'LastEvaluatedKey' in response:
        response = table.scan(
            ProjectionExpression=ProjectionExpression, 
            ExclusiveStartKey=response['LastEvaluatedKey'])
        data.extend(response['Items'])

    with table.batch_writer() as batch:
        for each in data:
            batch.delete_item(
                Key={key: each[key] for key in tableKeyNames}
            )
            
truncateTable("YOUR_TABLE_NAME")

你能详细解释一下截断表格是什么意思吗?我不知道你说的是什么意思。@garnaat截断我的意思是清空一个表。清空一个表最有效的方法是删除它并重新创建它。如果是我,我会使用CloudFormation模板来创建表/索引等,然后使用CreateStack、DeleteStack来管理其生命周期。当我尝试时,我注意到旧表的项仍在新表中。显然,随着时间的推移,这些项目似乎都被删除了,而这并不是我所需要的:我需要在部署期间进行一些测试,直到这些项目出现之前,我根本无法继续