如何使用boto3和条件检查来更新dynamodb中的字典列表



我有dynamodb

  • groupIdis分区键
  • empdetailsis list
  • dataDetails是我需要更新的属性名
  • 如果列表不存在,它必须创建,但如果存在,那么我需要更新字典

我需要为新字典更新字典的dataDetails列表,当且仅当'empId': 1001不在dataDetails

代码在

下面
new_obj = {'groupId':101, 'empId': 1001, 'empName': 'Joe'}

在我的dataDetails列表中[{'empId': 1002, 'empName': 'Fra'}]已经存在

所以当前的dataDetails列表是[{'empId': 1002, 'empName': 'Fra'}, {'empId': 1001, 'empName': 'Joe'}]

dynamodb_resource = boto3.resource('dynamodb')
table = dynamodb_resource.Table('myTable')
groupId = new_object['groupId']
data_details = {"empId": new_object['empId'],
"empName": new_object['empName']}
result = table.update_item(
Key={
'groupId': groupId ,
},
UpdateExpression=
'SET dataDetails = list_append(if_not_exists(dataDetails, :empty_list), :data_details)',
ExpressionAttributeValues={
':data_details': [data_details], ':empty_list': []
},
ReturnValues="UPDATED_NEW"
)

我得到了一个错误"errorMessage": "调用UpdateItem操作时发生了一个错误(ValidationException): Invalid UpdateExpression:表达式中使用的表达式属性值未定义;属性值::empty_list",

经过多次尝试,我得到了解决方案[data_details],它应该在列表中。更新以上代码供参考

是否有任何条件检查,我可以这样做,如果'empId': 1001已经在dataDetails中,使它不应该追加到字典?

有更多的例外,你看到你的解决方案是错误的,但让我们使用一个问题的stackoverflow每个问题按照规则。当前异常是因为您使用了一个尚未声明的变量,您可以这样声明它:

dynamodb_resource = boto3.resource('dynamodb')
table = dynamodb_resource.Table('myTable')
groupId = new_object['groupId']
data_details = {"empId": new_object['empId'],
"empName": new_object['empName']}
result = table.update_item(
Key={
'groupId': groupId ,
},
UpdateExpression=
'SET dataDetails = list_append(if_not_exists(dataDetails, :empty_list), :data_details)',
ExpressionAttributeValues={
':data_details': [data_details], 
':empty_list': []
},
ReturnValues="UPDATED_NEW"
)

最新更新