我正在尝试对 DynamoDB 表进行简单的操作。架构非常简单(哈希键)SummaryId:字符串(排序键)状态:字符串def put_item(dynamo_table, summary_id, status): return dynamo_table.put_item( Item={ 'SummaryId': summary_id, 'Status': status }, ReturnValues="ALL_OLD" )def update_item(dynamo_table, summary_id, status): response = dynamo_table.update_item( Key={'SummaryId': summary_id}, AttributeUpdates={ 'Status': status, }, ReturnValues="UPDATED_OLD" ) return responsedef initialize_dynamodb_table(): dynamodb = boto3.Session(profile_name=PROFILE_NAME, region_name=REGION_NAME) \ .resource('dynamodb') return dynamodb.Table(TABLE_NAME)def main(): dynamodb_table = initialize_dynamodb_table() # Update the above item response = put_item(dynamodb_table, "Id1::Id2::Id4", "IN_PROGRESS") pprint(response) response = update_item(dynamodb_table, "Id1::Id2::Id4", "COMPLETE") pprint(response)if __name__ == '__main__': main()PK“Id1::Id2::Id4”的项目不存在。因此 put_item() 预计会添加此项目。我使用 update_item() api 的目的是它将项目状态从“IN_PROGRESS”更改为“COMPLETE”。相反,update_item() API 在表中创建一个新项目,其中包含 PK“Id1::Id2::Id4”和 RK“COMPLETE”我如何实现预期的行为?提前致谢!
1 回答
胡子哥哥
TA贡献1825条经验 获得超6个赞
根据您描述的架构,两个操作(放置和更新)会产生两个不同的项目,这是预期的行为。
DynamoDB 的核心概念页面描述了分区键(哈希)和排序键(范围),如下所示:
分区键 – 一种简单的主键,由一个称为分区键的属性组成。
和
分区键和排序键 - 称为复合主键,这种类型的键由两个属性组成。第一个属性是分区键,第二个属性是排序键。
对你来说重要的是:
在具有分区键和排序键的表中,两个项目可能具有相同的分区键值。但是,这两个项目必须具有不同的排序键值。
PK Id1::Id2::Id4
将上述内容应用于您的情况,这意味着您正在使用-SK IN_PROGRESS
和另一个对象Id1::Id2::Id4
-创建一个对象SK COMPLETE
。
如果您的唯一标识符只是Id1::Id2::Id4
,则更改表的架构并仅保留分区键,如果您这样做,上面的代码将首先插入具有该 ID 和状态的项目,然后将IN_PROGRESS
同一项目更新为COMPLETE
。
添加回答
举报
0/150
提交
取消