如何更新特定 DynamoDB 项目的嵌套属性名称

问题描述 投票:0回答:1

我使用

boto3
客户端来管理 DynamoDB 项目。我们假设项目结构如下:

{
  "id": "item_id",
  "name": "item_name",
  "age": 23,
  "body": {
    {"nested": "nested_data"}
  }
}

在某些时候出现了错误,某些项目插入了

nested
键,而不是
nested_error
键:

{
  "id": "item_id",
  "name": "item_name",
  "age": 23,
  "body": {
    {"nested_error": "nested_data"}
  }
}

该错误已得到修复,我想实施一项“迁移”,将所有受影响的项目的

nested_error
键重命名为
nested
键。如果属性名称已经是
nested
,则应跳过该操作。

进行此类迁移的正确方法是什么?我应该使用

boto3
实现脚本还是使用
awscli
命令就足够了?或者也许可以通过 AWS 控制台来完成?我应该使用什么命令?

python amazon-web-services amazon-dynamodb boto3
1个回答
0
投票

最佳方法取决于您拥有多少数据。我个人会选择 CLI,因为它会自动分页。需要注意的一件事是如果数据集很大,则限制异常。在代码中实现一些睡眠可能很容易修复:

#!/bin/bash

TABLE_NAME="YourTableName"

SCAN_RESULTS=$(aws dynamodb scan \
  --table-name $TABLE_NAME \
  --filter-expression "attribute_exists(#body.#nested_error)" \
  --expression-attribute-names '{"#body": "body", "#nested_error": "nested_error"}')

ITEMS=$(echo $SCAN_RESULTS | jq -c '.Items[]')

echo "$ITEMS" | while IFS= read -r ITEM; do
  ITEM_ID=$(echo $ITEM | jq -r '.id.S')
    NESTED_ERROR=$(echo $ITEM | jq -r '.body.M.nested_error.S')
    
    aws dynamodb update-item \
    --table-name $TABLE_NAME \
    --key '{"id": {"S": "'"$ITEM_ID"'"}}' \
    --update-expression "SET #body.#nested = :nested REMOVE #body.#nested_error" \
    --expression-attribute-names '{"#body": "body", "#nested": "nested", "#nested_error": "nested_error"}' \
    --expression-attribute-values '{":nested": {"S": "'"$NESTED_ERROR"'"}}'
done
© www.soinside.com 2019 - 2024. All rights reserved.