2017-10-13 3 views
1

Ich versuche, Daten in dynamodb mit update_item zum ersten Mal zu speichern. In einem anderen Bereich meines Projekts habe ich put_item() erfolgreich verwendet. Für diesen neuen Codebereich speichere ich nur Elemente, die sich ändern, wobei Elemente in der Datenbank unverändert bleiben. Daher muss ich update_item() verwenden. Ich kann jedoch nicht herausfinden, warum meine Syntax für den API-Aufruf nicht korrekt ist. Ich benutze dies direkt von der Amazon-Benutzeroberfläche.Amazon lambda dynamodb update_item() akzeptiert nur Schlüsselwortargumente

Hier ist meine Python-Code:

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 

Hier ist der Ausgang:

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 

ich die update_item docs recherchiert (https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) und haben meine Anfrage nach diesem SO q & ein durch modellierte mkobit (https://stackoverflow.com/users/627727/mkobit): https://stackoverflow.com/a/30604746/8027640

Ich habe mit Variationen in der Syntax gespielt, einschließlich Hinzufügen das Wörterbuch {"S": "vielleicht funktioniert das"} anstelle meiner Variablen val und habe auch versucht, die Variable in einen statischen Inhalt zu ändern, um zu sehen, ob es funktioniert, aber kein Glück.

Dies ist eindeutig ein Syntaxproblem, aber ich konnte es nicht aufspüren. Vorschläge?

Antwort

1

Ich denke, das Beispiel, das Sie verwenden, basiert auf boto2, die ziemlich unterschiedliche Schnittstelle im Vergleich zu boto3 hat.

Schauen Sie stattdessen in the boto3 documentation, sollten Sie Schlüsselwortargumente als Fehler verwenden (und Sie verwenden das Wörterbuch). Ihre Anfrage sollte etwa so aussehen:

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

Vielen Dank. Es waren folgende Änderungen notwendig: 'key ['UID'] = {" S ": event ['uid']} Schlüssel ['screenId'] = {" S ": event ['screenid']}' und 'ExpressionAttributeNames = { "#attrName": str (Artikel) }, ExpressionAttributeValues ​​= { ": attrValue": { "S": str (val) } }' – Doug