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?
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