为了账号安全,请及时绑定邮箱和手机立即绑定

boto3 DynamoDB update_item() API 创建一个新项目而不是更新它

boto3 DynamoDB update_item() API 创建一个新项目而不是更新它

慕田峪4524236 2023-07-18 10:27:48
我正在尝试对 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


查看完整回答
反对 回复 2023-07-18
  • 1 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信