表名:products
一、SET — 修改或新增字段
改之前
Lambda 代码
import boto3
client = boto3.client('dynamodb')
def lambda_handler(event, context):
client.update_item(
TableName='products',
Key={'product_id': {'S': 'P001'}},
UpdateExpression='SET price = :p, stock = :s',
ExpressionAttributeValues={
':p': {'N': '599'},
':s': {'N': '80'}
}
)改之后
SET 也能新增字段。如果字段不存在,会自动创建。
新增字段示例
client.update_item(
TableName='products',
Key={'product_id': {'S': 'P001'}},
UpdateExpression='SET color = :c',
ExpressionAttributeValues={
':c': {'S': '黑色'}
}
)改之后
二、SET 数学运算 — 加减库存
改之前
Lambda 代码
def lambda_handler(event, context):
# 库存减 5
client.update_item(
TableName='products',
Key={'product_id': {'S': 'P001'}},
UpdateExpression='SET stock = stock - :n',
ExpressionAttributeValues={
':n': {'N': '5'}
}
)改之后
stock = stock + :n就是加库存,stock = stock - :n就是减库存。
三、REMOVE — 删除字段
改之前
Lambda 代码
def lambda_handler(event, context):
client.update_item(
TableName='products',
Key={'product_id': {'S': 'P001'}},
UpdateExpression='REMOVE color'
)改之后
color 字段整个消失了,不是变成空,是彻底没了。
四、ADD — 数字原子加(适合并发场景)
改之前
Lambda 代码
def lambda_handler(event, context):
# 库存加 20
client.update_item(
TableName='products',
Key={'product_id': {'S': 'P001'}},
UpdateExpression='ADD stock :n',
ExpressionAttributeValues={
':n': {'N': '20'}
}
)改之后
ADD 和 SET 的区别:ADD 是原子操作,多个 Lambda 同时加库存不会冲突。SET 在高并发下可能覆盖。
ADD 减库存:
:n传负数{'N': '-5'}。
五、SET + REMOVE 组合使用
改之前
Lambda 代码
def lambda_handler(event, context):
client.update_item(
TableName='products',
Key={'product_id': {'S': 'P001'}},
UpdateExpression='SET price = :p REMOVE old_field',
ExpressionAttributeValues={
':p': {'N': '549'}
}
)改之后
一次调用同时改价格 + 删废弃字段。SET 和 REMOVE 之间不需要逗号,直接空格隔开。
六、带条件更新 — ConditionExpression
改之前
Lambda 代码
def lambda_handler(event, context):
try:
client.update_item(
TableName='products',
Key={'product_id': {'S': 'P001'}},
UpdateExpression='SET stock = stock - :n',
ConditionExpression='stock >= :n',
ExpressionAttributeValues={
':n': {'N': '10'}
}
)
except client.exceptions.ConditionalCheckFailedException:
print('库存不足,扣减失败')库存 95 >= 10,条件满足,改之后:
如果库存只有 3,条件不满足(3 < 10):
数据不变,抛出 ConditionalCheckFailedException。
比赛中扣库存一定要加条件判断,防止库存变负数。
七、ExpressionAttributeNames — 字段名是保留字时
name 和 status 是 DynamoDB 保留字,直接写会报错。
改之前
Lambda 代码
def lambda_handler(event, context):
client.update_item(
TableName='products',
Key={'product_id': {'S': 'P001'}},
UpdateExpression='SET #n = :n, #s = :s',
ExpressionAttributeNames={
'#n': 'name',
'#s': 'status'
},
ExpressionAttributeValues={
':n': {'S': '机械键盘Pro'},
':s': {'S': 'discontinued'}
}
)改之后
#n是占位符,映射到真实字段名name。:n是值占位符。#开头 = 字段名,:开头 = 值。