如何更新列表中字典的表项值?

问题描述 投票:0回答:1

我试图简单地更新以下 dynamodb 表项中的实例类型。但我似乎不知道如何做到这一点,因为它位于一个名为

instanceParameters
的属性内,它是键值对的列表。

{
"PK":"pk_value",
"SK":"sk_value",
"instanceParameters": [
  {
   "key": "AZ",
   "value": "us-east-1a"
  },
  {
   "key": "SubnetId",
   "value": "subnet-0a123455623235f1"
  },
  {
   "key": "VpcId",
   "value": "vpc-0a1234567890a1"
  },
  {
   "key": "InstanceType",
   "value": "t2.12xlarge"
  }
 ]
}

这是我必须更新 InstanceType 值的 python 代码:

import boto3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Instances')

def update_database(pk, sk):
    try:
        res = table.update_item(
            Key={
                'PK': pk,
                'SK': sk
            },
            ConditionExpression= 'attribute_exists(instanceParameters)',
            UpdateExpression='SET #key = :val',
            ExpressionAttributeNames={
                '#key': 'InstanceType'
            },
            ExpressionAttributeValues={
                ':val':'t2.4xlarge'
            },
            ReturnValues='UPDATED_NEW'
        )
    except Exception as e:
        print(e)
    print(res)

没有错误,但表中没有任何内容更新。我认为 UpdateExpression 字段的语法不正确,并且找不到要更新的正确字段。有什么想法吗?谢谢!

amazon-dynamodb boto3
1个回答
0
投票

您可以检索整个 instanceParameters 列表,修改代码中所需的条目 (InstanceType),然后将更新后的列表写回 DynamoDB 表,而不是直接更新 UpdateExpression 中的 InstanceType(这不适用于嵌套列表)使用 UpdateExpression。

    import boto3
    
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('Instances')
    
    def update_instance_type(pk, sk, new_instance_type):
        try:
            # Fetch the current item
            response = table.get_item(Key={'PK': pk, 'SK': sk})
            item = response.get('Item', {})
            
            if not item or 'instanceParameters' not in item:
                print("Item or instanceParameters not found")
                return
            
            # Modify the InstanceType in instanceParameters
            for param in item['instanceParameters']:
                if param['key'] == 'InstanceType':
                    param['value'] = new_instance_type
                    break
            
            # Update the item in DynamoDB
            table.update_item(
                Key={'PK': pk, 'SK': sk},
                UpdateExpression="SET instanceParameters = :params",
                ExpressionAttributeValues={':params': item['instanceParameters']},
                ReturnValues="UPDATED_NEW"
            )
            print("InstanceType updated successfully!")
        
        except Exception as e:
            print(f"Error updating InstanceType: {e}")
    
    # Call the function
    update_instance_type("pk_value", "sk_value", "t2.4xlarge")
© www.soinside.com 2019 - 2024. All rights reserved.