0

私はAWS LambdaでPythonの単純な関数を使用して、DynamoDBテーブルにデータを格納しています。 put_item()関数。 Pythonの関数ここでDynamoDBにリストを送信するときにParameterVailidationが失敗する

"errorMessage": 
"Parameter validation failed:\nInvalid type for parameter 
Item.GSRResults.L[0], value: 3.8, type: <class 'float'>, valid types: <class 'dict'> 
\nInvalid type for parameter Item.GSRResults.L[1], value: 3.4, type: <class 'float'>, valid types: <class 'dict'>\... snip... 
\nInvalid type for parameter Item.GSRResults.L[9], value: 3.3, type: <class 'float'>, valid types: <class 'dict'>", 
    "errorType": "ParamValidationError", 
    "stackTrace": [ 
    [ 
     "/var/task/index.py", 
     39, 
     "upload_test", 
     "Item=item" 
    ], 

されています:

{ 
    "body": { 
    "Item": { 
     "UID": { 
     "S": "U999999" 
     }, 
     "PID": { 
     "S": "P444444" 
     }, 
     "GSRResults": { "L": [3.8,3.4,3.3,2.8,1.3,3.2,4.3,2.1,3.2,3.3] } 
    } 
    }, 
    "httpMethod": "POST" 
} 
+0

DynamoDBでは浮動小数点値を挿入できません。 – Asdfg

+0

@Asdfgお返事ありがとうございます。 '' L ":[" Cookies "、" Coffee "、3.14159]' –

+0

Dynamodbでは、float値をNumberとして保存することができます。 – notionquest

答えて

2

私はClient.put_itemを使用して動作するように、次の取得することができた:

import boto3 
client = boto3.client('dynamodb') 

item = { 
    "id": { 
    "S": "1", 
    }, 
    "name": { 
    "S": "Testing" 
    }, 
    "age": { 
    "N": "22" 
    }, 
    "grades": { 
    "L": [ {"N": "3.50"}, {"N": "2.75"}, {"N": "3.80"}, {"N": "3.1415926"} ] 
    } 
} 

client.put_item(TableName='test', Item=item); 

をそして、私は次のようにTable.put_itemを使用して仕事を得ることができました:

import boto3 
dynamodb = boto3.resource('dynamodb') 
table = dynamodb.Table('test') 

item2 = { 
    "id": "2", 
    "name": "Testing2", 
    "age": 22, 
    "grades": [ decimal.Decimal('3.50'), decimal.Decimal('3.1415926') ] 
} 

table.put_item(Item=item2) 

関連conversationにいつboto3 Clientと対Resourceを使用するか。

+0

これは本当にありがとう!これはLambdaとDynamoDBで初めての作業ですので、すべてのデータを適切にフォーマットする方法をまだ学習しています。私はデータを取得するときに、私はこのdictsのリストを解析し、リスト内のすべての値を取得する必要があると思います。不都合なことですが、少なくともこれは今働いています。 –

1

def upload_test(event, context): 
    if event['httpMethod'] == 'POST': 
     info = event['body'] 
     item = info['Item'] 
     return respond(None, dynamo.put_item(
      TableName="TestResults", 
      Item=item)) 

これは私が送りますJSONがある私は、デバッグに見えることはできません、次のエラーを取得しています

浮動小数点値はPythonではデミカルとして設定する必要があります。

インポート: -

import decimal 

小数点以下のように値を設定します -

"GSRResults": [decimal.Decimal('3.8'),decimal.Decimal('3.4')] 
番号を伴うタイプの

Dynamodb Type for Python

、それはことをお勧めします10 オブジェクトは、Python型をラウンドトリップできるようにするために使用されます。

+0

私はこれを試してみましたが、それはまだタイプがdictではないと不平を言っています。 –

+0

私はそれをテストしました。それは私のためにうまく動作します。私はjson文字列に明示的に "L"型を持っていません。私のjsonString = {"storage_CACHE_KEY": "2"、 "GSRResults":[decimal.Decimal( '3.8')、decimal.Decimal( '3.4')]} – notionquest

関連する問題