我使用
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 控制台来完成?我应该使用什么命令?
最佳方法取决于您拥有多少数据。我个人会选择 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