仅更新给定的值并忽略 dynamodb 中的其他值
Only update the value given and ignore other values in dynamodb
您好,我正在编写一个 lambda 函数,它将使用 boto3 更新 DynamoDb。在此代码中,employee_id
是自动生成的,但您必须提供 last_name
或 first_name
。我用 if-else
来做。如果属性趋于增加,则检查也会增加。我无法继续使用 if 条件。我该如何解决这个问题 我应该做出哪些改变
import boto3
import json
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Employee')
def lambda_handler(event, context):
employee_id = event['employee_id']
if 'first_name' in event and 'last_name' not in event:
first_name = event['first_name']
UpdateExpression = 'SET first_name = :val1'
ExpressionAttributeValues = {':val1': first_name }
elif 'last_name' in event and 'first_name' not in event:
last_name = event['last_name']
UpdateExpression = 'SET last_name = :val1'
ExpressionAttributeValues = {':val1': last_name}
elif 'first_name' in event and 'last_name' in event:
last_name = event['last_name']
first_name= event['first_name']
UpdateExpression = 'SET last_name = :val1, first_name = :val2'
ExpressionAttributeValues = {
':val1': last_name,
':val2': first_name
}
else:
raise ValueError("first_name and last_name not given")
update = table.update_item(
Key={
'employee_id': employee_id
},
ConditionExpression= 'attribute_exists(employee_id)',
UpdateExpression=UpdateExpression,
ExpressionAttributeValues=ExpressionAttributeValues
)
我想出但不起作用的代码
import boto3
import json
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Employee')
def lambda_handler(event, context):
employee_id = event['employee_id']
last_name= event['last_name']
first_name= event['first_name']
column = [first_name,last_name]
for i in range(0,len(column):
query = 'SET {} = :val1,:val2'.format(column[i])
response = table.update_item(
Key={
'employee_id': employee_id
},
ConditionExpression= 'attribute_exists(employee_id)',
UpdateExpression = query,
ExpressionAttributeValues={
':val1': first_name,
':val2': last_name
},
ReturnValues="UPDATED_NEW"
)
您应该考虑分别存储更新表达式和表达式值,然后将完整的集合传递给 Lambda 函数。
这还允许您针对每个参数进行验证(也许将其分解为验证函数以避免函数过大)。这样您就可以同时支持必需参数和可选参数,然后在最后验证更新表达式是否具有有效参数。
也许像下面这样?
import boto3
import json
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Employee')
def lambda_handler(event, context):
update_expression_values = []
expression_attribute_values = {}
if 'employee_id' in event:
employee_id = event['employee_id']
else:
raise ValueError("employee_id not given")
if 'first_name' in event:
update_expression_values.append('first_name = :val_first_name')
expression_attribute_values[':val_first_name'] = event['first_name']
if 'last_name' in event:
update_expression_values.append('last_name = :val_last_name')
expression_attribute_values[':val_last_name'] = event['last_name']
if len(update_expression_values) < 1:
raise ValueError("first_name and last_name not given")
seperator = ','
update = table.update_item(
Key={
'employee_id': employee_id
},
ConditionExpression= 'attribute_exists(employee_id)',
UpdateExpression='SET ' + seperator.join(update_expression_values),
ExpressionAttributeValues=expression_attribute_values
)
这可以进一步分解以通过可以执行这些检查的函数重用逻辑,如下所示。
import boto3
import json
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Employee')
update_expression_values = []
expression_attribute_values = {}
def lambda_handler(event, context):
global update_expression_values
global expression_attribute_values
update_expression_values = []
expression_attribute_values = {}
if 'employee_id' in event:
employee_id = event['employee_id']
else:
raise ValueError("employee_id not given")
process_event_key(event, 'first_name')
process_event_key(event, 'last_name')
process_event_key(event, 'new_value')
if len(update_expression_values) < 1:
raise ValueError("first_name and last_name not given")
seperator = ','
update = table.update_item(
Key={
'employee_id': employee_id
},
ConditionExpression= 'attribute_exists(employee_id)',
UpdateExpression='SET ' + seperator.join(update_expression_values),
ExpressionAttributeValues=expression_attribute_values
)
def process_event_key(event, key):
global update_expression_values
global expression_attribute_values
if key in event:
update_expression_values.append(key + ' = :val_' + key)
expression_attribute_values[':val_' + key] = event[key]
测试活动
{
"new_value": "test",
"employee_id": "value2",
"last_name": "value3",
"first_name": "value4"
}
您好,我正在编写一个 lambda 函数,它将使用 boto3 更新 DynamoDb。在此代码中,employee_id
是自动生成的,但您必须提供 last_name
或 first_name
。我用 if-else
来做。如果属性趋于增加,则检查也会增加。我无法继续使用 if 条件。我该如何解决这个问题 我应该做出哪些改变
import boto3
import json
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Employee')
def lambda_handler(event, context):
employee_id = event['employee_id']
if 'first_name' in event and 'last_name' not in event:
first_name = event['first_name']
UpdateExpression = 'SET first_name = :val1'
ExpressionAttributeValues = {':val1': first_name }
elif 'last_name' in event and 'first_name' not in event:
last_name = event['last_name']
UpdateExpression = 'SET last_name = :val1'
ExpressionAttributeValues = {':val1': last_name}
elif 'first_name' in event and 'last_name' in event:
last_name = event['last_name']
first_name= event['first_name']
UpdateExpression = 'SET last_name = :val1, first_name = :val2'
ExpressionAttributeValues = {
':val1': last_name,
':val2': first_name
}
else:
raise ValueError("first_name and last_name not given")
update = table.update_item(
Key={
'employee_id': employee_id
},
ConditionExpression= 'attribute_exists(employee_id)',
UpdateExpression=UpdateExpression,
ExpressionAttributeValues=ExpressionAttributeValues
)
我想出但不起作用的代码
import boto3
import json
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Employee')
def lambda_handler(event, context):
employee_id = event['employee_id']
last_name= event['last_name']
first_name= event['first_name']
column = [first_name,last_name]
for i in range(0,len(column):
query = 'SET {} = :val1,:val2'.format(column[i])
response = table.update_item(
Key={
'employee_id': employee_id
},
ConditionExpression= 'attribute_exists(employee_id)',
UpdateExpression = query,
ExpressionAttributeValues={
':val1': first_name,
':val2': last_name
},
ReturnValues="UPDATED_NEW"
)
您应该考虑分别存储更新表达式和表达式值,然后将完整的集合传递给 Lambda 函数。
这还允许您针对每个参数进行验证(也许将其分解为验证函数以避免函数过大)。这样您就可以同时支持必需参数和可选参数,然后在最后验证更新表达式是否具有有效参数。
也许像下面这样?
import boto3
import json
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Employee')
def lambda_handler(event, context):
update_expression_values = []
expression_attribute_values = {}
if 'employee_id' in event:
employee_id = event['employee_id']
else:
raise ValueError("employee_id not given")
if 'first_name' in event:
update_expression_values.append('first_name = :val_first_name')
expression_attribute_values[':val_first_name'] = event['first_name']
if 'last_name' in event:
update_expression_values.append('last_name = :val_last_name')
expression_attribute_values[':val_last_name'] = event['last_name']
if len(update_expression_values) < 1:
raise ValueError("first_name and last_name not given")
seperator = ','
update = table.update_item(
Key={
'employee_id': employee_id
},
ConditionExpression= 'attribute_exists(employee_id)',
UpdateExpression='SET ' + seperator.join(update_expression_values),
ExpressionAttributeValues=expression_attribute_values
)
这可以进一步分解以通过可以执行这些检查的函数重用逻辑,如下所示。
import boto3
import json
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Employee')
update_expression_values = []
expression_attribute_values = {}
def lambda_handler(event, context):
global update_expression_values
global expression_attribute_values
update_expression_values = []
expression_attribute_values = {}
if 'employee_id' in event:
employee_id = event['employee_id']
else:
raise ValueError("employee_id not given")
process_event_key(event, 'first_name')
process_event_key(event, 'last_name')
process_event_key(event, 'new_value')
if len(update_expression_values) < 1:
raise ValueError("first_name and last_name not given")
seperator = ','
update = table.update_item(
Key={
'employee_id': employee_id
},
ConditionExpression= 'attribute_exists(employee_id)',
UpdateExpression='SET ' + seperator.join(update_expression_values),
ExpressionAttributeValues=expression_attribute_values
)
def process_event_key(event, key):
global update_expression_values
global expression_attribute_values
if key in event:
update_expression_values.append(key + ' = :val_' + key)
expression_attribute_values[':val_' + key] = event[key]
测试活动
{
"new_value": "test",
"employee_id": "value2",
"last_name": "value3",
"first_name": "value4"
}