如何通过SQS消息Payload更新DynamoDB表项且不覆盖原有结构?
解决DynamoDB update_item意外覆盖表结构的问题
你的EC2脚本里update_count函数的核心问题是UpdateExpression的语法错误,DynamoDB的ADD操作不需要写等式(#vote = #vote + :incr),错误的语法导致更新逻辑异常,进而意外覆盖了表结构。
修正后的代码
def update_count(vote): logging.info('update count....') table.update_item( Key={'voter': 'count'}, UpdateExpression="ADD #vote :incr", ExpressionAttributeNames={'#vote': vote}, ExpressionAttributeValues={':incr': 1}, ReturnValues="UPDATED_NEW" # 可选,返回更新后的值方便验证 )
关键说明
ADD是DynamoDB专门用于数值累加的操作,正确语法为ADD <属性名> <增量值>,它会自动对指定的数值类型属性执行加操作;如果属性不存在,还会自动创建该属性并赋值为增量值- 你可以额外添加
ConditionExpression来限制只有属性存在时才执行更新,避免意外新增属性:
把这行加入ConditionExpression="attribute_exists(#vote)",update_item的参数中即可。
修正后发送测试事件,DynamoDB里voter='count'的条目,指定的b属性会从20变为21,a属性保持11不变,不会再出现结构被覆盖的问题。
内容的提问来源于stack exchange,提问作者ERJAN
相关产品推荐
相关产品推荐

