我正在使用 python 和 boto3 从不同的源获取一些数据,并且只想更新 dynamodb 表中的一列。
但是,如果 Dynamodb 中不存在主键或行,我希望创建整行。
想知道我可能做错了什么?
我指定要更新的
UpdateExpression
的单列,并将其包含为 ExpressionAttributeNames
和 ExpressionAttributeValues
。如果我要更新 dynamo 中已存在的一行数据,这效果很好。
ExpressionAttributeNames = {
'#amount': 'amount',
}
ExpressionAttributeValues = {}
for request in requests:
ExpressionAttributeValues[f":{key}"] = val
response = table.update_item(
Key={ 'id': primaryKey },
UpdateExpression= 'set #amount = :amount',
ExpressionAttributeNames=ExpressionAttributeNames,
ReturnValues= 'ALL_NEW',
ExpressionAttributeValues=ExpressionAttributeValues
)
如果该行不存在,则当附加行可以包含其他列(例如 {item、count、color 等})并且我需要这些附加数据列时,它只会创建
id
和 amount
列当 Dynamo 中不存在时创建。我能想到的唯一解决方案是让它成为一个条件,并使用conditionExpression仅在primaryKey存在时更新,然后根据响应,我们将决定是否有必要创建该行。我们需要有一个 diff ExpressionAttributeNames 和 ExpressionAttributeValues 来捕获行的所有列。这是正确的吗?
非常感谢这里的任何帮助!
您必须在更新项目(1 个请求)时设置所有值,或者对现有项目使用条件表达式。如果它不满足条件,则您将执行 PutItem 将所有值(2 个请求)。