Amazon lambda dynamodb update_item() принимает только аргументы ключевого слова

Я пытаюсь сохранить данные в dynamodb, используя update_item в первый раз. В другой области моего проекта я успешно использовал put_item(). Для этой новой области кода я сохраняю только те элементы, которые изменяются, оставляя элементы в базе данных без изменений. Таким образом, мне нужно использовать update_item(). Однако я не могу понять, почему мой синтаксис неверен для вызова API. Я использую это непосредственно из пользовательского интерфейса Amazon.

Вот мой код на питоне:

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 (https://stackoverflow.com/users/627727/mkobit): https://stackoverflow.com/a/30604746/8027640

Я играл с вариациями синтаксиса, в том числе добавлял словарь {"S": "возможно, это работает"} вместо моей переменной val, а также пытался изменить переменную на некоторый статический контент, чтобы увидеть, работает ли он, но не повезло .

Очевидно, это проблема синтаксиса, но я не смог ее отследить. Предложения?


person Doug    schedule 13.10.2017    source источник


Ответы (1)


Я думаю, что пример, который вы используете, основан на boto2, который имеет совершенно другой интерфейс по сравнению с boto3.

Вместо этого изучите документацию по boto3, вы должны использовать аргументы ключевого слова в качестве состояний ошибки (и вы используете словарь). Ваш запрос должен выглядеть примерно так:

response = dynamodb.update_item(
    TableName="ScreenData",
    Key=key,
    UpdateExpression="SET #attrName = :attrValue",
    ExpressionAttributeNames={
        "#attrName" : item
    },
    ExpressionAttributeValues={
        ":attrValue" : val
    }
)
person Boris Serebrov    schedule 15.10.2017
comment
Спасибо. Также потребовались следующие изменения: key['UID'] = { "S" : event['uid'] } key['screenId'] = { "S" : event['screenid'] } и ExpressionAttributeNames={ "#attrName" : str(item) }, ExpressionAttributeValues={ ":attrValue" : { "S" : str(val) } } - person Doug; 18.10.2017