如何在DynamoDB多层嵌套结构中向指定列表位置追加map
错误根因
DynamoDB 的 UpdateExpression 语法中,数组下标位置不支持使用 : 开头的 ExpressionAttributeValues 值占位符,仅属性名、属性值的位置可使用这类占位符,将下标变量直接放入表达式作为占位符的写法不符合语法规范,因此触发语法校验报错。
可行实现方案
直接在代码层将下标变量拼入更新路径字符串即可,无需将下标变量放入 ExpressionAttributeValues 中,示例代码如下:
# 提前拼接好包含下标的更新路径,i、j为存储目标位置的业务变量 update_path = f"list1[{i}].list2[{j}].list3" # 替换为你实际要追加的map数据,不要用map作为变量名(map是Python内置函数) new_map = { # 你的map属性内容 } table.update_item( Key={ 'primary_key': item_name }, UpdateExpression=f"SET {update_path} = list_append({update_path}, :x)", ExpressionAttributeValues={ ':x': [new_map] # list_append要求两个入参都是列表,因此要把新map包裹进列表中 } )
可选优化
如果不能保证目标路径的 list3 一定已经存在,可以新增if_not_exists判断避免路径不存在报错,修改后的参数如下:
UpdateExpression=f"SET {update_path} = list_append(if_not_exists({update_path}, :empty_list), :x)", ExpressionAttributeValues={ ':x': [new_map], ':empty_list': [] }
注意事项
- 执行更新前请确保
i、j是对应数组的合法下标,否则会触发DynamoDB路径不存在的报错。 list_append方法的两个入参都必须是列表类型,因此要追加的单个map需要包裹在列表中传入。
内容的提问来源于stack exchange,提问作者Xela
相关产品推荐
相关产品推荐

