在本课中,您将练习几个将数据插入 DynamoDB 并进行数据检索的简单示例。您将使用 CreateTable API 创建 DynamoDB 表,然后使用 BatchWriteItem API 调用插入一些项目。最后,您将使用 GetItem API 调用检索个别项目。在练习这些示例前,我们将介绍示例网上书店应用程序将使用的数据模型。

在后面的模块中,您将学习如何使用 Query API 调用来一次检索多个项目,以及如何使用二级索引启用额外的查询模式。您还将学习如何更新表中现有的项目。

完成模块所需时间:15 分钟


本模块中将使用下列重要的 DynamoDB 概念:

  • 表:DynamoDB 数据记录的集合。
  • 项目:DynamoDB 表中的单条数据记录,相当于关系数据库中的行。
  • 属性:项目的单个数据元素,相当于关系数据库中的列。但与关系数据库中的列不同,除本模块稍后将介绍的主键外,您无需在创建表时指定属性。属性可以是字符串、整数或布尔值等简单的类型,也可以是列表或映射等复杂的类型。
  • 主键:主键是 DynamoDB 表中单个项目的唯一标识符。主键名称和类型必须在创建表时指定,并且写入表的每个项目都必须包含指定类型的主键。简单主键由一个简单属性组成;复合主键由两个属性组成:分区键和排序键。例如,您可以使用“UserID”创建一个简单主键以作为标识符,或者使用“UserID”和“Creation_Date”的组合创建一个复合主键以作为项目标识符。

在构建应用程序时,您应始终注意设计符合应用程序逻辑需要的数据模型。此数据模型的设计应考虑您的应用程序在读取和写入数据时的数据访问需要。

DynamoDB 是一种非关系数据库。使用非关系数据库时,您无需在创建表时事先指定完整的架构。您只需声明表的主键,这是表中每条记录的唯一标识符。这将减少设计数据模型的前期费用,因为您可以随着应用程序需求的变化轻松修改架构。

如本教程“简介”中的“应用程序背景”部分所提到,您的应用程序需要能够按书名和作者检索图书。由于书名和作者的组合是图书的唯一标识符,您可以将这些属性作为表的主键。您的应用程序还需要存储有关图书类别的信息(例如历史类或传记类)以及有关图书装订样式的信息(即精装版、平装版或有声版),并与您库存系统中的货号对应。

鉴于这些需求,您可以将以下架构用于您的表:

  • Title(字符串):图书名称
  • Author(字符串):图书作者
  • Category(字符串):图书类别,例如历史类、传记类、科幻类等
  • Formats(映射):可供销售的图书装订样式(例如精装版、平装版和有声版)以及在库存系统中的货号

在下面的步骤中,您将指定表的复合主键(AuthorTitle),从而创建表。然后,您将一些项目加载到表中,并从表中读取个别项目。


  • 第 1 步:创建 DynamoDB 表

    您下载的目录包含一个 create_table.py 脚本,该脚本将使用 CreateTable API 创建一个 Books 表。在 AWS Cloud9 终端中输入以下命令即可运行此脚本。

    $ python create_table.py

    如果您使用 AWS Cloud9 编辑器打开了 create_table.py 脚本,则应注意:

    • 该脚本利用 CreateTable API 调用中的 KeySchema 参数指定了表的复合主键。您的表将 Author 作为哈希键使用,将 Title 作为范围键使用。
    • 此脚本将通过定义读取容量单位数和写入容量单位数来指定表的预置吞吐量。DynamoDB 允许您单独设置读取和写入容量,从而让您可以根据应用程序的需求优化配置,避免产生过度预置的费用。
  • 第 2 步:将项目加载到表中

    在这一步中,您会将一些图书加载到表中。在 AWS Cloud9 终端中运行以下命令。
    $ python insert_items.py
    此命令将会运行以下脚本。
    import boto3
    
    dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
    table = dynamodb.Table('Books')
    
    with table.batch_writer() as batch:
        batch.put_item(Item={"Author": "John Grisham", "Title": "The Rainmaker",
            "Category": "Suspense", "Formats": { "Hardcover": "J4SUKVGU", "Paperback": "D7YF4FCX" } })
        batch.put_item(Item={"Author": "John Grisham", "Title": "The Firm",
            "Category": "Suspense", "Formats": { "Hardcover": "Q7QWE3U2",
            "Paperback": "ZVZAYY4F", "Audiobook": "DJ9KS9NM" } })
        batch.put_item(Item={"Author": "James Patterson", "Title": "Along Came a Spider",
            "Category": "Suspense", "Formats": { "Hardcover": "C9NR6RJ7",
            "Paperback": "37JVGDZG", "Audiobook": "6348WX3U" } })
        batch.put_item(Item={"Author": "Dr. Seuss", "Title": "Green Eggs and Ham",
            "Category": "Children", "Formats": { "Hardcover": "GVJZQ7JK",
            "Paperback": "A4TFUR98", "Audiobook": "XWMGHW96" } })
        batch.put_item(Item={"Author": "William Shakespeare", "Title": "Hamlet",
            "Category": "Drama", "Formats": { "Hardcover": "GVJZQ7JK",
            "Paperback": "A4TFUR98", "Audiobook": "XWMGHW96" } })
    

    如上面的脚本所示,您使用 BatchWriteItem API 将五种图书加载到表中。每种图书都包含主键的 AuthorTitle 属性,以及有关图书的额外信息的 CategoryFormats 属性。每个属性都有一个类型,可以是简单类型(例如 Category 属性为字符串),也可以是复杂类型(例如 Formats 属性为映射)。

    请注意您将使用 Boto 3 客户端库通过 HTTP API 插入数据。所有数据访问和操作请求都将通过 HTTP 请求执行,而不是像关系数据库管理系统那样维护持久性数据库连接。

  • 第 3 步:检索表中的项目

    您可以使用 GetItem API 请求并指定所需项目的主键来检索单本图书。

    在 AWS Cloud9 终端中运行以下命令。

    $ python get_item.py

    这将运行以下脚本来检索单个项目,例如 John Grisham 的 The RainMaker

    import boto3
    
    dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
    table = dynamodb.Table('Books')
    
    resp = table.get_item(Key={"Author": "John Grisham", "Title": "The Rainmaker"})
    
    print(resp['Item'])

    您的终端应打印出表中检索到的完整图书数据。

    $ python get_item.py
    {'Title': 'The Rainmaker', 'Formats': {'Hardcover': 'J4SUKVGU', 'Paperback': 'D7YF4FCX'}, 'Author': 'John Grisham', 'Category': 'Suspense'}

    由于表中的每个项目都以主键为唯一标识符,GetItem API 调用将始终返回表中的最多一个项目。


    在下一个模块中,您将学习如何通过单个 API 调用从 DynamoDB 表中检索多个项目。您还将学习如何使用二级索引在表中启用多数据访问模式。