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

我正在尝试对 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 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()

PK“Id1::Id2::Id4”的项目不存在。因此 put_item() 预计会添加此项目。我使用 update_item() api 的目的是它将项目状态从“IN_PROGRESS”更改为“COMPLETE”。相反,update_item() API 在表中创建一个新项目,其中包含 PK“Id1::Id2::Id4”和 RK“COMPLETE”


我如何实现预期的行为?提前致谢!


慕田峪4524236
浏览 91回答 1
1回答

胡子哥哥

根据您描述的架构,两个操作(放置和更新)会产生两个不同的项目,这是预期的行为。DynamoDB 的核心概念页面描述了分区键(哈希)和排序键(范围),如下所示:分区键 – 一种简单的主键,由一个称为分区键的属性组成。和分区键和排序键 - 称为复合主键,这种类型的键由两个属性组成。第一个属性是分区键,第二个属性是排序键。对你来说重要的是:在具有分区键和排序键的表中,两个项目可能具有相同的分区键值。但是,这两个项目必须具有不同的排序键值。PK Id1::Id2::Id4将上述内容应用于您的情况,这意味着您正在使用-SK IN_PROGRESS 和另一个对象Id1::Id2::Id4-创建一个对象SK COMPLETE。如果您的唯一标识符只是Id1::Id2::Id4,则更改表的架构并仅保留分区键,如果您这样做,上面的代码将首先插入具有该 ID 和状态的项目,然后将IN_PROGRESS同一项目更新为COMPLETE。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python