モジュール 4: 項目の更新
UpdateItem API を使用して、データベース内の既存の項目の属性を更新します。
概要
このモジュールでは、UpdateItem API を使用して、データベース内の既存の項目の属性を更新します
アプリケーションのユースケース
データの書き込みと読み込みに加えて、定期的にデータベースの既存データを更新できます。最初に項目を読み込み、次に一定の更新を行って全項目を書き込みし直すのではなく、単一の呼び出しでデータを更新できる最良の方法です。DynamoDB では UpdateItem API 呼び出しを使用して既存の項目を更新できます。
この例では、各項目にフォーマット属性があったことを思い出してください。これはブックストアが、あるタイトルに対して持っているさまざまなフォーマットのマップです。今後新しいフォーマットを追加したりフォーマットの取り扱いを中止したりするときに、特定の本のマップを更新する必要があります。
所要時間
15 分
実装
-
項目の更新
アプリケーションコードで項目を更新する場合は、次の 4 つの要素に注目してください。
# 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 つの各要素があります。まず、更新操作を行う項目の [Key] (キー) として [Author] (著者) に John Grisham、[Title] (タイトル) に The Rainmaker を指定します。
次に、更新式で使用する式属性名を指定します。マップであるフォーマット属性を修正することになるため、属性 (フォーマット) とマップ内のキー (オーディオブック) の両方の式属性名を定義する必要があります。
それから、UpdateItem API 呼び出しに適用する更新式を書き込みます。この更新式には、前に定義した式属性名と式属性値を使用します。SET #formats.#audiobook = :idの式は、[Formats] (フォーマット) 属性の [Audiobook] (オーディオブック) キーを、8WE3KPTP という指定 ID 値に設定するよう DynamoDB に指示します。
最後に、式属性値で使用する値を設定します。今回のフォーマットのマップでは、フォーマットの値は在庫システムの項目番号となります。この例では、値は 8WE3KPTP です。
update_item.py スクリプトを実行すると、このモジュール内のコードブロックに先ほど登場した UpdateItem API 呼び出しが行われます。呼び出しによる違いを示すために、スクリプトでまず項目を取り出して出力してから、更新呼び出しを行います。次に UpdateItem API 呼び出しを行います。それから、スクリプトで 2 回目の項目の取得と出力を実行して違いを示します。
スクリプトを実行する前に、数行追加する必要があります。Cloud9 で update_item.py を開き、スクリプトの先頭に次の 3 行を貼り付けます。
import boto3 dynamodb = boto3.resource('dynamodb', region_name='us-east-1') table = dynamodb.Table('Books')
次に、以下のコマンドを実行します。
$ 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 で既存の項目を更新する方法をご説明しました。 次のモジュールでは、作成したリソースをクリーンアップして追加料金を回避する方法をご説明します。