簡體   English   中英

如何更新 map DynamoDB 中的屬性

[英]How to update attributes in map DynamoDB

我想更新 #info 中的屬性 #name 但有時 #info 不存在

table.update_item(
    Key={
        'id': '001'
    },
    UpdateExpression='SET #k = if_not_exists(#k, :i), #k.#ks = :kv',
    ExpressionAttributeNames={
        '#k': 'info',
        '#ks': 'name'
    },
    ExpressionAttributeValues={
        ':i': {},
        ':kv': 'new_name'
    }
)

調用 UpdateItem 操作時發生錯誤(ValidationException):Invalid UpdateExpression:兩個文檔路徑相互重疊; 必須刪除或重寫這些路徑之一; 路徑一:[信息],路徑二:[信息,名稱]

我想檢查 #info 是否存在。 如果沒有,創建一個新的#info,如果有,更新#name。

很快:嘗試更新該字段,假設它存在,如果失敗,請檢查是否由於您嘗試更新的字段不存在而導致驗證異常,並從根級別創建它。

否則,在條目創建時將info字段設置為空字典。

def udpateItemName(id, val):
    try:
        table.update_item(
            Key={
                'id': id
            },
            UpdateExpression='SET #k.#ks = :kv',
            ExpressionAttributeNames={
                '#k': 'info',
                '#ks': 'name',
            },
            ExpressionAttributeValues={
                ':kv': val
            }
        )
    }
    except botocore.exceptions.ClientError as ce:
        if ce.response['Error']['Code'] != 'ValidationException':
            # some further checks can be made on ['Error']['Message'] here to be sure 
            # that the error is due to non existing path
            raise ce
        table.update_item(
            Key={
                'id': id
            },
            UpdateExpression='SET #k = :kv',
            ExpressionAttributeNames={
                '#k': 'info'
            },
            ExpressionAttributeValues={
                ':kv': {"name": val}
            }
        )
    }   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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