DynamoDBのSet型でデータの数が0個になったとき、Attribute自体が残るか消えるか確認してみた
DynamoDBにはSet型があります。このSet型のデータを削除したとき、データの数が0個になったらどうなるんだ?と気になったので、試してみました。
おすすめの方
- DynamoDBのSet型でデータの数が0個になったときの動作を知りたい方
- DynamoDBのSet型でデータを削除したい方
適当なDynamoDBテーブルを用意する
次のDynamoDBテーブルを作成します。
- Name: set-test-table
- PK: itemId
aws dynamodb create-table \
--table-name set-test-table \
--attribute-definitions AttributeName=itemId,AttributeType=S \
--key-schema AttributeName=itemId,KeyType=HASH \
--billing-mode PAY_PER_REQUEST
DynamoDBでSet型のデータを追加する
Set型のデータを追加するスクリプト
import boto3
table = boto3.resource("dynamodb").Table("set-test-table")
def main() -> None:
put(
{
"itemId": "item1",
"tags": {
"Apple",
"Banana",
},
}
)
add("item1", {"Cherry", "Durian"})
def put(item: dict) -> None:
table.put_item(Item=item)
def add(item_id: str, tags: set[str]) -> None:
table.update_item(
Key={"itemId": item_id},
UpdateExpression="ADD #tags :tags",
ExpressionAttributeNames={"#tags": "tags"},
ExpressionAttributeValues={":tags": tags},
)
if __name__ == "__main__":
main()
実行すると、tagsに4つのデータがある
DynamoDBでSet型のデータを削除する
では、次にset型のデータ4つを「DELETE」ですべて削除します。REMOVEではありません。
Set型のデータを削除するスクリプト
import boto3
table = boto3.resource("dynamodb").Table("set-test-table")
def main() -> None:
delete("item1", {"Apple", "Banana", "Cherry", "Durian"})
def delete(item_id: str, tags: set[str]) -> None:
table.update_item(
Key={"itemId": item_id},
UpdateExpression="DELETE #tags :tags",
ExpressionAttributeNames={"#tags": "tags"},
ExpressionAttributeValues={":tags": tags},
)
if __name__ == "__main__":
main()
実行すると、tagsが消えた
tagsのデータが消えましたが、tags自体も無くなりました。tags自体は残ると思っていたので、個人的には予想外の結果です。
さいごに
DynamoDBのSet型でデータの数が0個になったとき、Attribute自体が消えました。