[英]DynamoDB update a counter (or insert a key)
我有一個生成(some_key, some_value)
對的函數,我想把它放在我的DynamoDB中。 如果具有鍵some_key
的項已存在,我想將some_value
添加到value
屬性。 否則我想創建這樣的項目。 按照文檔中的示例,似乎函數if_not_exists
應該做我想要的。 我遇到了語法問題,因為我的代碼返回錯誤:
>>>> table.update_item(
Key={
'key': my_key
},
UpdateExpression="set my_value = if_not_exist(my_value + :inc, :inc)",
ExpressionAttributeValues={
':inc': my_increment,
},
ReturnValues="UPDATED_NEW"
)
ClientError: An error occurred (ValidationException) when calling the UpdateItem operation:
Invalid UpdateExpression: Syntax error; token: "+", near: "coocc + :val"
對於這種類型的操作,您可以簡單地使用ADD
功能。 來自文檔 :
ADD - 如果該屬性尚不存在,則將指定的值添加到項目中。 如果該屬性確實存在,則ADD的行為取決於屬性的數據類型
因此,通過使用boto3.client()
您可以執行以下操作:
client.update_item(
TableName='MyTable',
Key={'myhash': {'S': 'myvalue'}},
UpdateExpression="ADD #counter :increment",
ExpressionAttributeNames={'#counter': 'counter'},
ExpressionAttributeValues={':increment': {'N': '1'}}
)
如果它不存在,這將創建counter
字段,如果它存在,它將增加它。
你可以這樣做:
table.update_item(
Key={
'key': my_key
},
UpdateExpression="SET my_value = if_not_exists(my_value, :start) + :inc",
ExpressionAttributeValues={
':inc': my_increment,
':start': 0,
},
ReturnValues="UPDATED_NEW"
)
update_item
將創建新項目還是更新現有項目。
UpdateExpression將檢查my_value
已存在並使用現有的my_value + :inc
。
如果my_value
不存在,那么它將使用:start
作為初始值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.