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