簡體   English   中英

DynamoDB更新計數器(或插入密鑰)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM