在本課中,您將逐步了解使用 DynamoDB 插入和擷取資料的一些簡單範例。您使用 CreateTable API 建立 DynamoDB 資料表,然後使用 BatchWriteItem API 呼叫插入一些項目。最後,使用 GetItem API 呼叫擷取個別項目。在了解這些範例之前,我們先討論範例線上書店應用程式中將使用的資料模型。

在後續的單元中,您將了解如何使用 Query API 呼叫一次擷取多個項目,以及如何透過使用次要索引啟用額外的查詢模式。您還將看到如何更新資料表中的現有項目。

完成單元的時間:15 分鐘


此單元中重點介紹了以下 DynamoDB 概念:

  • 資料表:DynamoDB 資料紀錄集合。
  • 項目:DynamoDB 資料表中的單個資料紀錄。相當於關聯式資料庫中的資料列。
  • 屬性:項目中的單一資料元素。相當於關聯式資料庫中的資料欄。但是,與關聯式資料庫中的資料欄不同的是,除了本單元稍後討論的主索引鍵,建立資料表時不需要指定屬性。屬性可以是簡單的類型,例如字串、整數或布林值,也可以是複雜的類型,例如清單或對應。
  • 主索引鍵:主索引鍵是 DynamoDB 資料表中單個項目的唯一識別碼。建立資料表時必須指定主索引鍵名稱和類型,且寫入資料表的每個項目必須包含指定類型的主索引鍵。簡單主索引鍵包含單一屬性,複合主索引鍵包含兩個屬性:部分索引鍵和排序索引鍵。例如,您可以使用 "UserID" 作為識別碼來建立簡單主索引鍵,或將 "UserID" 和 "Creation_Date" 合併為項目識別碼,來建立複合主索引鍵。

構建應用程式時,您應始終花時間設計應用程式邏輯中需要的資料模型。此資料模型設計應考量應用程式中將用於讀取和寫入資料的資料存取需要。

DynamoDB 是一種非關聯式資料庫。使用非關聯式資料庫,建立資料表時,您無需指定完整的結構描述預付費用。您只需為資料表宣告主索引鍵,其會唯一識別您資料表中的每個紀錄。這可降低設計資料模型的預付費用,因為您可以在應用程式的需要變更時修改結構描述。

如本教學「簡介」中「應用程式背景」部分中所提及,您的應用程式需要依標題和作者檢索個別書籍。由於標題和作者組合是唯一的書籍識別碼,您可以使用這些屬性作為資料表的主索引鍵。您的應用程式還需要儲存有關書籍類別的資訊,例如歷史或傳記,以及書籍可用格式 — 精裝書、平裝書或有聲書,這些會對應至您庫存系統中的項目編號。

謹記這些需求,您可以針對資料表使用以下結構描述:

  • 標題 (字串):書的標題
  • 作者 (字串):書的作者
  • 類別 (字串):書類別,例如歷史、傳記,以及科幻
  • 格式 (對應):可用銷售的不同格式 (例如精裝書、平裝書和有聲書) 及其在庫存系統中的項目編號

在下列步驟中,透過為資料表指定複合主索引鍵 (作者標題) 來建立資料表。然後,您將一些項目載入到資料表,並從該資料表讀取個別項目。


  • 步驟 1.建立 DynamoDB 資料表

    您下載的目錄包括 create_table.py 指令碼,其會使用 CreateTable API 建立 Books 資料表。您可以透過在 AWS Cloud9 終端機中輸入以下命令來執行此指令碼。

    $ python create_table.py

    如果您使用 AWS Cloud9 編輯器開啟 create_table.py 指令碼,您應該會注意到:

    • 指令碼使用 CreateTable API 呼叫中的 KeySchema 引數指定資料表的複合主索引鍵。您的資料表使用作者作為雜湊鍵,使用標題作為範圍鍵。
    • 指令碼透過單一讀取容量單位和寫入容量單位,來指定資料表的佈建輸送量。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 將五本書載入資料表。每本書都包含主索引鍵的 Author Title 屬性,以及有關書的額外資訊的 Category Formats 屬性。每個屬性都有一個類型,可以是簡單類型,例如用於 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 資料表中擷取多個項目。您還將了解如何使用次要索引在資料表中啟用多個資料存取模式。