DynamoDB の update_item() で、SET・REMOVE・ADD・DELETEを同時に実行する

DynamoDB の update_item() で、SET・REMOVE・ADD・DELETEを同時に実行する

できるんです。
Clock Icon2024.07.29

DynamoDBの項目を更新するとき、Attributeを同時に追加・更新・削除したくなることがあります。

「あれ? できるよね?」となったので、試してみました。

おすすめの方

  • boto3でDynamoDBの追加や更新をしたい方
  • DynamoDBのupdate_item() で、SET・REMOVE・ADD・DELETEを同時に実行したい方

事前準備:データをputする

DynamoDBに適当なデータを追加します。ADDとDELETE用にString Setがあります。

put.py
import boto3

dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("boto3-test")

def main():
    # 事前準備
    put()

def put():
    table.put_item(
        Item={
            "todoId": "1111",
            "title": "Learn DynamoDB",
            "completed": False,
            "hello": "world",
            "tags": {"aaa", "bbb", "ccc"},
            "category": {"111", "222", "333"},
        }
    )

if __name__ == "__main__":
    main()

スクリプトを実行します。

python put.py

DynamoDBにデータが追加されました。これで準備完了です。

01_dynamodb_put

update_item() で、SET・REMOVE・ADD・DELETEを同時に操作する

1度のupdate_item()で、SET・REMOVE・ADD・DELETEを同時に実行します。

  • SET
    • titleとcompletedを更新
    • noteを追加
  • REMOVE
    • helloを削除
  • ADD
    • tagsに値を追加
  • DELETE
    • categoryから値を削除
操作 Attribute Before After
SET title Learn DynamoDB Learn Lambda
SET completed false true
SET note (無い) This is a note
REMOVE hello world (無い)
ADD tags {"aaa","bbb","ccc"} {"aaa","bbb","ccc","zzz"}
DELETE category {"111","222", "333"} {"111","333"}

これは、「UpdateExpression」に複数記入することで実現できました。同じAttributeに対する同時操作はできないので、それぞれ異なるAttributeを操作しています。

update.py
import boto3

dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("boto3-test")

def main():
    update()

def update():
    table.update_item(
        Key={"todoId": "1111"},
        UpdateExpression="SET #title = :title, #completed = :completed, #note = :note REMOVE #hello ADD #tags :tags DELETE #category :category",
        ExpressionAttributeNames={
            "#title": "title",
            "#completed": "completed",
            "#note": "note",
            "#hello": "hello",
            "#tags": "tags",
            "#category": "category",
        },
        ExpressionAttributeValues={
            ":title": "Learn Lambda",
            ":completed": True,
            ":note": "This is a note",
            ":tags": {"zzz"},
            ":category": {"222"},
        },
    )

if __name__ == "__main__":
    main()

スクリプトを実行します。

python update.py

期待通りに更新されました!

02_dynamodb_update_item

さいごに

DynamoDBの項目を更新するとき、Attributeを同時に追加・更新・削除してみました。参考になれば幸いです。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.