我试图简单地更新以下 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 字段的语法不正确,并且找不到要更新的正确字段。有什么想法吗?谢谢!
您可以检索整个 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")