Привет, я пишу лямбда-функцию, которая обновит DynamoDb с помощью boto3. В этом коде employee_id
создается автоматически, но вы должны указать last_name
или first_name
. Я делаю это с if-else
. Если атрибут имеет тенденцию к увеличению, проверки тоже. Я не могу продолжать жить в таком состоянии. Как я могу с этим справиться, какие изменения мне следует внести
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"
)
if condition
. Если я добавлю еще один атрибут, например электронную почту, в свой динамодб, и мне придется его обновить, мне нужно будет написать больше проверок, я пытаюсь сделать свой код маленьким и эффективным 28.08.2020UpdateExpression = 'SET first_name = :val1'
Это может сработать, но я не могу этого сделать. Вы можете помочь? Примерно так stackoverflow.com/questions/63283009/ 28.08.2020print('SET ' + seperator.join(update_expression_values))
непосредственно перед тем, как получить результатSET first_name = :val_first_name,last_name = :val_last_name,new_value = :val_new_value
28.08.2020If check
будет становиться длиннее с увеличением атрибутов. stackoverflow.com/questions/63283009/ 28.08.2020employee_id
создается автоматически и является первичным ключом.employee_id
используется здесь для получения содержимого этого идентификатора. Другой столбец в моей таблице - first_name и last_name. Он динамически обновляется, если указано только first_name, а last_name остается как есть. 28.08.2020process_event_key
проверяет, существует ли этот ключ в событии, и если он действительно добавляет новое значение в список выражений обновления и новый ключ в словарьexpression_attribute_values
. Они содержат динамические части запроса на обновление, как только обновление произойдет, оно объединит каждое значение вupdate_expression_values
, чтобы создать строку, подобнуюSET first_name=:val_first_name,last_name=:val_last_name
.expression_attribute_values
будет содержать значения. 28.08.2020global update_expression_values global
expression_attribute_values
Почему они оба находятся вprocess_event_key
иhandler
29.08.2020process_event_key(event, 'first_name')
и хотим взять first_name непосредственно из json, если значение существует, обновите его, в противном случае создайте новый столбец. Мы можем это сделать? 01.09.2020