2017-10-13 10 views
1

처음으로 update_item을 사용하여 dynamodb에 데이터를 저장하려고합니다. 내 프로젝트의 다른 영역에서 나는 put_item()을 성공적으로 사용했다. 이 새로운 코드 영역에서는 변경된 항목 만 저장하고 변경되지 않은 항목은 db에 남겨 둡니다. 따라서 update_item()을 사용해야합니다. 그러나 API 호출에 대한 구문이 올바르지 않은 이유를 알아낼 수 없습니다. Amazon UI에서 직접 사용하고 있습니다. 나는 update_item 워드 프로세서 (https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html)을 연구하고이 SO Q & 바이 후에 내 쿼리를 모델로 한Amazon lambda dynamodb update_item()은 키워드 인수 만 허용합니다.

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 

: 여기

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 

이 출력됩니다 : 여기

내 파이썬 코드 mkobit ( https://stackoverflow.com/users/627727/mkobit) : https://stackoverflow.com/a/30604746/8027640

필자는 구문을 변형하여 사전 ("S": "maybe this works")을 내 변수 val 대신 사용하고 정적 콘텐츠로 변수를 변경하여 작동하는지 확인했지만 행운은 없었습니다.

분명히 이것은 구문 문제이지만이를 추적 할 수 없었습니다. 제안?

답변

1

내가 사용하는 예제가 boto3과 완전히 다른 인터페이스를 가지고있는 boto2을 기반으로한다고 생각합니다.

대신 을 조사해보십시오. 오류 상태로 키워드 인수를 사용해야하며 사전을 사용해야합니다. 요청하신 내용은 대략 다음과 같습니다.

response = dynamodb.update_item(
    TableName="ScreenData", 
    Key=key, 
    UpdateExpression="SET #attrName = :attrValue", 
    ExpressionAttributeNames={ 
     "#attrName" : item 
    }, 
    ExpressionAttributeValues={ 
     ":attrValue" : val 
    } 
) 
+0

고맙습니다. 다음과 같은 변경이 필요합니다 : key [ 'UID'] = { "S": event [ 'uid']} key [ 'screenId'] = { "S": event [ 'screenid']}' 및 'ExpressionAttributeNames = { "#attrName"STR (항목) } = { ExpressionAttributeValues ​​ "ATTRVALUE"{ "S"STR (val) 인 }}' – Doug