2017-10-13 6 views
1

Je tente d'enregistrer des données dans dynamodb en utilisant update_item pour la première fois. Dans une autre partie de mon projet, j'ai utilisé put_item() avec succès. Pour cette nouvelle zone de code, je ne sauvegarde que les éléments qui changent, laissant les éléments de la base de données inchangés. Ainsi, j'ai besoin d'utiliser update_item(). Cependant, je n'arrive pas à comprendre pourquoi ma syntaxe n'est pas correcte pour l'appel de l'API. J'utilise ceci directement à partir de l'interface utilisateur Amazon.Amazon lambda dynamodb update_item() n'accepte que les mots-clés

Voici mon code 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 

est ici la sortie:

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 

J'ai fait des recherches les update_item docs (https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) et ont modélisé ma requête après SO q & un par mkobit (https://stackoverflow.com/users/627727/mkobit): https://stackoverflow.com/a/30604746/8027640

J'ai joué avec des variations sur la syntaxe, y compris l'ajout le dictionnaire {"S": "peut-être que cela fonctionne"} au lieu de ma variable val, et j'ai aussi essayé de changer la variable en un contenu statique pour voir si cela fonctionne, mais pas de chance.

Il s'agit clairement d'un problème de syntaxe, mais j'ai été incapable de le suivre. Suggestions?

Répondre

1

Je pense que l'exemple que vous utilisez est basé sur boto2 qui a une interface assez différente par rapport à boto3.

Au lieu de cela, regardez dans the boto3 documentation, vous devez utiliser les arguments de mot-clé comme les états d'erreur (et vous utilisez le dictionnaire). Votre demande devrait ressembler à peu près comme ceci:

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

Merci. Les modifications suivantes étaient également nécessaires: 'key ['UID'] = {" S ": event ['uid']} key ['screenId'] = {" S ": événement ['screenid']}' et 'ExpressionAttributeNames = { "#attrName": str (point) }, { ExpressionAttributeValues ​​= ": attrValue": { "S": str (val) }}' – Doug