Python 用boto清空DynamoDB表
我如何用boto优化(从财务成本角度)清空DynamoDB表?(正如我们在SQL中使用语句所做的那样。)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.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来管理其生命周期。当我尝试时,我注意到旧表的项仍在新表中。显然,随着时间的推移,这些项目似乎都被删除了,而这并不是我所需要的:我需要在部署期间进行一些测试,直到这些项目出现之前,我根本无法继续