2017-10-13 90 views
1

初めてupdate_itemを使用してdynamodbにデータを保存しようとしています。私のプロジェクトの別の領域では、put_item()を使用しました。この新しいコード領域では、変更されたアイテムのみを保存しています。変更されていないアイテムをデータベースに残しています。したがって、私はupdate_item()を使用する必要があります。しかし、なぜ私の構文がAPI呼び出しに対して正しくないのか分かりません。私はこれをAmazon UIから直接使用しています。ここでAmazon lambda dynamodb update_item()はキーワード引数のみを受け入れます。

は私の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 

が出力されます。

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 &後によると、私のクエリをモデル化していますmkobit(https://stackoverflow.com/users/627727/mkobit):https://stackoverflow.com/a/30604746/8027640

私は、構文のバリエーションを追加しました。私の変数valの代わりに辞書( "S": "maybe this works")を使用し、変数が静的なコンテンツに変更されて動作するかどうかを確認しました。

明らかにこれは構文の問題ですが、私はそれを追跡することができませんでした。提案?

答えて

1

あなたが使用している例は、boto3とはかなり異なるインターフェースを持っているboto2に基づいていると思います。

代わりにthe boto3 documentationを調べると、エラー状態としてキーワード引数を使用する必要があります(辞書を使用している場合)。 リクエストはおおよそ次のようになります。

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

ありがとうございます。キー['UID'] = {"S":イベント['uid']} キー['screenId'] = {"S":イベント['screenid']} 'そして 'ExpressionAttributeNames = { "#attrName":STR(アイテム) }、 ExpressionAttributeValues = { ":ATTRVALUE":{ "S":STR(ヴァル) }}' – Doug

関連する問題