Amazon lambda dynamicodb update_item() принимает только ключевые аргументы
Я пытаюсь сохранить данные в DynamodB с использованием update_item в первый раз. В другой области моего проекта я успешно использовал put_item(). Для этой новой области кода я сохраняю только те элементы, которые меняются, оставляя элементы в БД без изменений. Таким образом, мне нужно использовать update_item(). Тем не менее, я не могу понять, почему мой синтаксис не является правильным для вызова API. Я использую это прямо из пользовательского интерфейса Amazon.
Вот мой код Python:
from __future__ import print_function
import json
import boto3
print('Loading function')
def saveScreenData(event, context):
dynamodb = boto3.client('dynamodb', region_name='us-east-1', endpoint_url="https://dynamodb.us-east-1.amazonaws.com")
print('The event: {}'.format(event))
key = {}
key['UID'] = event['uid']
key['screenId'] = event['screenid']
print('Key: {}'.format(key))
for item, val in event.items():
if item != 'uid' and item != 'screenid':
print("Saving!")
response = dynamodb.update_item({
"TableName" : "ScreenData",
"Key" : key,
"UpdateExpression" : "SET #attrName = :attrValue",
"ExpressionAttributeNames" : {
"#attrName" : item
},
"ExpressionAttributeValues" : {
":attrValue" : val
}
})
print('Response: {}'.format(response))
return response
Вот вывод:
START RequestId: 2da9412a-b03d-11e7-9dc8-8fcb305833f6 Version: $LATEST
The event: {'article': '<p>↵ First!↵</p>', 'screenid': '13', 'uid': '0', 'section1': '<h1>↵ Second↵</h1>'}
Key: {'UID': '0', 'screenId': '13'}
Saving!
update_item() only accepts keyword arguments.: TypeError
Traceback (most recent call last):
File "/var/task/saveScreenData.py", line 30, in saveScreenData
":attrValue" : val
File "/var/runtime/botocore/client.py", line 310, in _api_call
"%s() only accepts keyword arguments." % py_operation_name)
TypeError: update_item() only accepts keyword arguments.
END RequestId: 2da9412a-b03d-11e7-9dc8-8fcb305833f6
Я исследовал документы update_item ( https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) и смоделировал свой запрос после этого SO q&a от mkobit ( mkobit): /questions/41201042/nevozmozhno-obnovit-element-v-dynamodb/41201047#41201047
Я поиграл с вариациями синтаксиса, включая добавление словаря {"S": "возможно, это работает"} вместо моей переменной val, а также попытался изменить переменную на некоторое статическое содержимое, чтобы увидеть, работает ли оно, но не повезло,
Очевидно, что это проблема синтаксиса, но я не смог отследить ее. Предложения?
1 ответ
Я думаю, что пример, который вы используете, основан на boto2
который имеет совершенно другой интерфейс по сравнению с boto3
,
Вместо этого, загляните в документацию по boto3, вы должны использовать ключевые аргументы в качестве состояний ошибок (а вы используете словарь). Ваш запрос должен выглядеть примерно так:
response = dynamodb.update_item(
TableName="ScreenData",
Key=key,
UpdateExpression="SET #attrName = :attrValue",
ExpressionAttributeNames={
"#attrName" : item
},
ExpressionAttributeValues={
":attrValue" : val
}
)