このモジュールでは、UpdateItem API を使用してデータベースにすでにある項目の属性を更新します。このモジュールでは、UpdateItem API を使用してデータベースにすでにある項目の属性を更新します。

モジュールの所要時間: 15 分


データの書き込みと読み込みに加えて、定期的にデータベースの既存データを更新できます。最初に項目を読み込み、次に一定の更新を行って全項目を書き込みし直すのではなく、単一の呼び出しでデータを更新できる最良の方法です。DynamoDB では UpdateItem API 呼び出しを使用して既存の項目を更新できます。

この例では、各項目にフォーマット属性があったことを思い出してください。これはブックストアが、あるタイトルに対して持っているさまざまなフォーマットのマップです。今後新しいフォーマットを追加したりフォーマットの取り扱いを中止したりするときに、特定の本のマップを更新する必要があります。


  • 項目の更新

    アプリケーションコードで項目を更新する場合は、次の 4 つの要素に注目してください。

    • 更新する項目を識別するキー
    • 更新する属性のプレースホルダーである式属性名
    • 更新する属性値のプレースホルダーである式属性値
    • 式属性名と式属性値を使用して更新を指定する更新式

    ジョン・グリシャムの『レインメーカー』のオーディオブックフォーマットを最近追加したので、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 呼び出しには 4 つの要素それぞれがあります。まず、更新操作を行う項目のキーとして著者ジョン・グリシャムタイトルに『レインメーカー』を指定します。

    次に、更新式で使用する式属性名を指定します。マップであるフォーマット属性を修正することになるため、属性 (フォーマット) とマップ内のキー (オーディオブック) の両方の式属性名を定義する必要があります。

    それから、UpdateItem API 呼び出しに適用する更新式を書き込みます。この更新式には、前に定義した式属性名と式属性値を使用します。SET #formats.#audiobook = :idの式は、フォーマット属性のオーディオブックキーを、8WE3KPTP という指定した ID 値に設定するよう DynamoDB に指示します。 

    最後に、式属性値で使用する値を設定します。今回のフォーマットのマップでは、フォーマットの値は在庫システムの項目番号となります。この例では、値は 8WE3KPTP です。

    update_item.py スクリプトを実行すると、このモジュール内のコードブロックに先ほど登場した UpdateItem API 呼び出しが行われます。呼び出しによる違いを示すために、スクリプトでまず項目を取り出して出力してから、更新呼び出しを行います。次に UpdateItem API 呼び出しを行います。それから、スクリプトで 2 回目の項目取り出しと出力を行って違いを示します。

    次のコマンドを実行することで、違いが実際にわかります。

    $ python update_item.py

    次のような出力が表示されます。

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

    ご覧の通り、更新を適用した後に『レインメーカー』に新しいオーディオブックフォーマットが追加されました。


    このモジュールでは、UpdateItem API で既存の項目を更新する方法をご説明しました。次のモジュールでは、作成したリソースをクリーンアップして追加の変更を回避する方法をご説明します。