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

模块 2:插入和检索数据

通过简单示例了解如何使用 DynamoDB 插入和检索数据

概述

在本模块中,您将通过一些简单的示例了解如何使用 DynamoDB 插入和检索数据。您将使用 CreateTable API 创建 DynamoDB 表,然后调用BatchWriteItem API 插入一些数据项。最后,您将调用 GetItem API 检索单个数据项。在您开始了解这些示例之前,我们将讨论在线书店应用示例中使用的数据模型。

在随后的模块中,您将学习如何调用 Query API 一次性检索多个数据项,并通过使用二级索引实现更多的查询模式。此外,您还会学习如何更新表中已有的数据项。

术语

以下是本模块中的 DynamoDB 关键概念:

  • Table(表):DynamoDB 数据记录的集合。
  • Item(数据项):DynamoDB 表中的单条数据记录。其类似于关系数据库中的行。
  • Attribute(属性):数据项中的单个数据元素。其类似于关系数据库中的列。然而,与关系数据库中的列不同,除了稍后在本模块中讨论的主键之外,无需在创建表时指定属性。属性可以是简单类型,例如字符串、整数或布尔值,也可以是复杂类型,例如列表或映射。
  • 主键:主键是 DynamoDB 表中单个数据项的唯一标识。在表创建时,必须指定主键名称和类型,并且每次向表中写入数据时都必须包含指定类型的主键。简单主键由单个属性构成,复合主键由两个属性构成:一个分区键和一个排序键。例如,您可以使用 UserID 作为标识创建简单主键,或者通过组合 UserID 和 Creation_Date 作为数据项标识创建复合主键。

数据模型

在构建应用程序时,设计应用程序逻辑中所需的数据模型是必不可少的步骤。数据模型的设计应该充分考虑应用程序的数据访问需求,无论是读取还是写入。

DynamoDB 是一种非关系数据库。在非关系数据库中,创建表时无需预先指定完整的 Schema(模式)。您只需声明表的 主键,该主键在表中唯一标识每条记录。这降低了设计数据模型的前期成本,因为您可以根据应用程序的需求轻松修改模式。

正如之前应用程序背景模块所提到的,您的应用程序需要通过书名和作者检索单本书籍。因为书名和作者的组合是书籍的唯一标识,所以您可以将这些属性用作表的主键。您的应用程序还需要存储关于书籍类别(如历史或传记)的信息,以及书籍的销售格式(精装本、平装本或有声书)与库存系统中的数据项编号的映射。

考虑到这些需求,您的表可以采用以下模式:

  • Title(字符串):书名
  • Author(字符串):书籍的作者
  • Category (字符串):书籍的类别,例如历史、传记和科幻
  • Formats(映射):您可供销售的不同书籍格式(如精装本、平装本或有声书)及其在库存系统中的数据项编号

在接下来的步骤中,您将通过指定表的复合主键(Author 和 Title)来创建表。接着,您会向表中添加一些数据项,并从中检索单个数据项。

 完成所需时间

15 分钟

执行步骤

  • 您下载的目录中包含一个 create_table.py 脚本,该脚本能够调用 CreateTable API 创建一个名为 Books 的表。在 AWS Cloud9 终端执行以下命令以运行该脚本。

    python create_table.py

    使用 AWS Cloud9 编辑器打开 create_table.py 脚本时,您应该注意到:

    • 脚本调用 CreateTable API 的 KeySchema 参数指定了表的复合主键。该表使用 Author​ 作为哈希键,Title 作为范围键。
    • 该脚本通过定义读取容量单位和写入容量单位指定了表的预配置吞吐量。在 DynamoDB 中,您可以分别设置读取和写入容量,以便根据应用程序需求进行精细调整,避免因过度配置而产生的高昂费用。
  • 此步骤将向表中导入一些书籍。在 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 将五本书导入到了表中。每本书都包括主键的 Author 和 Title 属性,以及有关书籍的其他信息的 Category 和 Formats 属性。每个属性都具有类型,既可以是简单的,如字符串类型的 Category 属性,也可以是复杂的,如映射类型的 Formats 属性。

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

  • 您可以使用 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 表中检索多个数据项。您还将学习如何通过使用二级索引在表中实现多种数据查询模式。

查询和全局二级索引