使用 Amazon DynamoDB 创建和管理非关系型数据库

模块 4:更新项目

您将使用 UpdateItem API 更新数据库中已有项目的属性

概览

在本模块中,您将使用 UpdateItem API 更新数据库中已有项目的属性。

应用程序使用场景

除了写入和读取数据之外,您还需要经常更新数据库中的现有数据。最好能够通过单次调用来更新这些数据,而不是首先读取项目,然后再将包含更新内容的完整项目写回。DynamoDB 允许您执行 UpdateItem API 调用在原位置更新项目。

对于这个示例,请回想一下,每个项目都有一个 Formats(格式)属性,它是从给定书目到其在书店中所有不同格式的映射。随着时间的推移,您需要对此映射的特定书籍部分进行更新,这可能是因为您添加了新的格式,也可能是因为您已停止使用某种格式。

 完成时间

15 分钟

操作步骤

  • 在应用程序代码中更新项目时,请关注以下四个要素:

    • Key(键):用于标识您想要更新的项目。
    • Expression attribute names(表达式属性名称):这是您想要更新的属性的占位符。
    • Expression attribute values(表达式属性值):这是您为想要更新的属性设置的新值的占位符。
    • update expression(更新表达式):它使用表达式属性名称和表达式属性值来声明您的更新内容。假设您最近为 John Grisham 的 The Rainmaker(《造雨人》)添加了有声书格式,并希望更新我们的 DynamoDB 表以反映这一变化。UpdateItem API 调用如下所示。
    # The UpdateItem API allows you to update a particular item as identified by its key.
    resp = table.update_item(
        Key={"Author": "John Grisham", "Title": "The Rainmaker"},
        # Expression attribute names specify placeholders for attribute names to use in your update expressions.
        ExpressionAttributeNames={
            "#formats": "Formats",
            "#audiobook": "Audiobook",
        },
        # Expression attribute values specify placeholders for attribute values to use in your update expressions.
        ExpressionAttributeValues={
            ":id": "8WE3KPTP",
        },
        # UpdateExpression declares the updates you want to perform on your item.
        # For more details about update expressions, see https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html
        UpdateExpression="SET #formats.#audiobook = :id",
    )

    您的 UpdateItem API 调用具备上述所有的四个要素。第一,它将 Author(作者)设置为 John Grisham,Title(标题)设置为 The Rainmaker(《造雨人》),以此来指明它要操作的项目的 Key(键)。

    第二,您指明要在更新表达式中使用的表达式属性名称。您要更新的属性是 Formats,这是一个映射,因此您需要为属性 (Formats) 和映射中的键 (Audiobook) 都定义表达式属性名称。

    最后,您编写想要在 UpdateItem API 调用中应用的更新表达式。这一更新表达式同时使用了之前定义的表达式属性名称和表达式属性值。表达式 SET #formats.#audiobook = :id 告知 DynamoDB 要将 Formats 属性的 Audiobook 键设为给定 ID 值 8WE3KPTP。 

    第三,您声明要在表达式属性值中采用的值。在 Formats 映射中,格式的值是您的库存系统中的项目编号。在本例中,这个值为 8WE3KPTP

    update_item.py 脚本会执行在本模块先前提到的代码段中展示的 UpdateItem API 调用。为展示调用产生的效果,该脚本会在执行更新调用之前检索并打印项目。然后再调用 UpdateItem API。最后,该脚本再次检索并打印项目,以展示前后差异。

    您需要在运行脚本之前添加几行代码。在 Cloud9 中打开 update_item.py,在脚本最上方粘贴下列三行代码:

    import boto3
    dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
    table = dynamodb.Table('Books')

    接下来,运行以下命令:

    $ python update_item.py
    

    现在,运行以下命令:

    $ python get_item.py

    您应当会看到以下输出结果:

    {'Title': 'The Rainmaker', 'Formats': {'Audiobook': '8WE3KPTP', 'Hardcover': 'J4SUKVGU', 'Paperback': 'D7YF4FCX'}, 'Author': 'John Grisham', 'Category': 'Suspense'}

    如您所见,在应用更新之后, The Rainmaker 有了一个新的 Audiobook 格式。

    在本模块中,您学习了如何使用 UpdateItem API 更新已有项目。在下一个模块中,您将学习如何清除已创建的资源,以免产生额外费用。

清除和后续步骤