boto3 DynamoDB update_item() API 创建一个新项目(带有范围键)而不是更新它
boto3 DynamoDB update_item() API creates a new item (with range key) instead of updating it
我正在我的 DynamoDB table 上尝试一个简单的操作。架构非常简单
(哈希键)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 response
def 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()
主键为“Id1::Id2::Id4”的项目不存在。所以 put_item() 应该添加这个项目。
我对 update_item() api 的意图是它将项目状态从“IN_PROGRESS”更改为“完成”。
但是 update_item() API 在 table 中使用 PK "Id1::Id2::Id4" 创建了一个新项目
和 RK“完成”
如何实现预期的行为?提前致谢!
根据您描述的架构,两个操作(放置和更新)会产生两个不同的项目,这是预期的行为。
DynamoDB 的 Core Concepts page 是这样描述分区键(哈希)和排序键(范围)的:
Partition key – A simple primary key, composed of one attribute known as the partition key.
和
Partition key and sort key – Referred to as a composite primary key, this type of key is composed of two attributes. The first attribute is the partition key, and the second attribute is the sort key.
对你来说重要的一点是:
In a table that has a partition key and a sort key, it's possible for two items to have the same partition key value. However, those two items must have different sort key values.
将以上内容应用于您的情况,这意味着您正在创建一个包含 PK Id1::Id2::Id4
- SK IN_PROGRESS
和另一个对象 Id1::Id2::Id4
- SK COMPLETE
.[=21 的对象=]
如果您的唯一标识符只是 Id1::Id2::Id4
,则更改 table 的架构并仅保留分区键,如果您这样做,上面的代码将首先插入一个具有该 ID 的项目和状态 IN_PROGRESS
,然后将同一项目更新为 COMPLETE
。
我正在我的 DynamoDB table 上尝试一个简单的操作。架构非常简单
(哈希键)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 response
def 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()
主键为“Id1::Id2::Id4”的项目不存在。所以 put_item() 应该添加这个项目。 我对 update_item() api 的意图是它将项目状态从“IN_PROGRESS”更改为“完成”。 但是 update_item() API 在 table 中使用 PK "Id1::Id2::Id4" 创建了一个新项目 和 RK“完成”
如何实现预期的行为?提前致谢!
根据您描述的架构,两个操作(放置和更新)会产生两个不同的项目,这是预期的行为。
DynamoDB 的 Core Concepts page 是这样描述分区键(哈希)和排序键(范围)的:
Partition key – A simple primary key, composed of one attribute known as the partition key.
和
Partition key and sort key – Referred to as a composite primary key, this type of key is composed of two attributes. The first attribute is the partition key, and the second attribute is the sort key.
对你来说重要的一点是:
In a table that has a partition key and a sort key, it's possible for two items to have the same partition key value. However, those two items must have different sort key values.
将以上内容应用于您的情况,这意味着您正在创建一个包含 PK Id1::Id2::Id4
- SK IN_PROGRESS
和另一个对象 Id1::Id2::Id4
- SK COMPLETE
.[=21 的对象=]
如果您的唯一标识符只是 Id1::Id2::Id4
,则更改 table 的架构并仅保留分区键,如果您这样做,上面的代码将首先插入一个具有该 ID 的项目和状态 IN_PROGRESS
,然后将同一项目更新为 COMPLETE
。