質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

1154閲覧

DynamoDBからデータを抽出したい。

Otazoman

総合スコア44

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2018/10/27 08:08

前提・実現したいこと

ここをサイトを参考にしてAWSLambda+DynamoDBでサーバレスでデータベースから値を取ってくるAPIチックなものを作ろうとしています。

サンプルと違うデータ構造で作成しようとしているのでエラーが出て
うまく対応できません。こういう場合にはDynamoDBのデータをどの様に持たせれば
うまく対応できますでしょうか。

item-category(Key)item(String-set)
1{"110-1111", "112-0000", "113-0000", "114-0001"}
2{"222-0001", "223-0002"}
3{"300-0002", "300-0003", "301-0001", "309-0004", "310-0000", "333-0004"}

発生している問題・エラーメッセージ

エラーは下記の様に型エラーでJSONをシリアライズできないという内容の様です。

Response: { "errorMessage": "{'112-0000', '110-1111', '114-0001', '113-0000'} is not JSON serializable", "errorType": "TypeError", "stackTrace": [ [ "/var/lang/lib/python3.6/json/__init__.py", 238, "dumps", "**kw).encode(obj)" ], [ "/var/lang/lib/python3.6/json/encoder.py", 199, "encode", "chunks = self.iterencode(o, _one_shot=True)" ], [ "/var/lang/lib/python3.6/json/encoder.py", 257, "iterencode", "return _iterencode(o, 0)" ], [ "/var/runtime/awslambda/bootstrap.py", 110, "decimal_serializer", "raise TypeError(repr(o) + \" is not JSON serializable\")" ] ] } Request ID: "f394c358-d9b9-11e8-bfcc-177cfa0a5a96" Function Logs: START RequestId: f394c358-d9b9-11e8-bfcc-177cfa0a5a96 Version: $LATEST An error occurred during JSON serialization of response: {'112-0000', '110-1111', '114-0001', '113-0000'} is not JSON serializable Traceback (most recent call last): File "/var/lang/lib/python3.6/json/__init__.py", line 238, in dumps **kw).encode(obj) File "/var/lang/lib/python3.6/json/encoder.py", line 199, in encode chunks = self.iterencode(o, _one_shot=True) File "/var/lang/lib/python3.6/json/encoder.py", line 257, in iterencode return _iterencode(o, 0) File "/var/runtime/awslambda/bootstrap.py", line 110, in decimal_serializer raise TypeError(repr(o) + " is not JSON serializable") TypeError: {'112-0000', '110-1111', '114-0001', '113-0000'} is not JSON serializable END RequestId: f394c358-d9b9-11e8-bfcc-177cfa0a5a96 REPORT RequestId: f394c358-d9b9-11e8-bfcc-177cfa0a5a96 Duration: 197.52 ms Billed Duration: 200 ms Memory Size: 128 MB Max Memory Used: 30 MB

該当のソースコード

python3.6

1import boto3 2 3dynamodb = boto3.resource('dynamodb') 4table = dynamodb.Table('item') 5 6def get_item(id): 7 response = table.get_item( 8 Key={ 9 'item-category': id 10 } 11 ) 12 return response['Item'] 13 14def lambda_handler(event, context): 15 item = get_item('1') 16 return item

試したこと

Stringにして通常の文字列を入れるとエラーにならずに値は取れました。

item-category(Key)item(String)
5"4444"
Response: { "value": "44444", "item-category": "5" } Request ID: "80bc4afd-d9bd-11e8-93ce-1bed5e34aeec"

string-Setにして下記の様な感じでデータを入れるとエラーとなりました。

item-category(Key)item(String-set)
6{"itemname":"111-0000", "itemname":"122-0001"}
Response: { "errorMessage": "{'\"itemname\":\"122-0001\"', '\"itemname\":\"111-0000\"'} is not JSON serializable", "errorType": "TypeError", "stackTrace": [ [ "/var/lang/lib/python3.6/json/__init__.py", 238, "dumps", "**kw).encode(obj)" ], [ "/var/lang/lib/python3.6/json/encoder.py", 199, "encode", "chunks = self.iterencode(o, _one_shot=True)" ], [ "/var/lang/lib/python3.6/json/encoder.py", 257, "iterencode", "return _iterencode(o, 0)" ], [ "/var/runtime/awslambda/bootstrap.py", 110, "decimal_serializer", "raise TypeError(repr(o) + \" is not JSON serializable\")" ] ] } Request ID: "e045d7f6-d9bd-11e8-9881-514ef66fa25e" Function Logs: START RequestId: e045d7f6-d9bd-11e8-9881-514ef66fa25e Version: $LATEST An error occurred during JSON serialization of response: {'"itemname":"122-0001"', '"itemname":"111-0000"'} is not JSON serializable Traceback (most recent call last): File "/var/lang/lib/python3.6/json/__init__.py", line 238, in dumps **kw).encode(obj) File "/var/lang/lib/python3.6/json/encoder.py", line 199, in encode chunks = self.iterencode(o, _one_shot=True) File "/var/lang/lib/python3.6/json/encoder.py", line 257, in iterencode return _iterencode(o, 0) File "/var/runtime/awslambda/bootstrap.py", line 110, in decimal_serializer raise TypeError(repr(o) + " is not JSON serializable") TypeError: {'"itemname":"122-0001"', '"itemname":"111-0000"'} is not JSON serializable END RequestId: e045d7f6-d9bd-11e8-9881-514ef66fa25e REPORT RequestId: e045d7f6-d9bd-11e8-9881-514ef66fa25e Duration: 186.88 ms Billed Duration: 200 ms Memory Size: 128 MB Max Memory Used: 30 MB

Stringにして以下の内容で。対応すると文字列として取得はできますが
エスケープが入ってしまいます。

item-category(Key)item(String)
5"{"itemname":"222-0003"},{"itemname":"310-0456"}"
{ "item": "{\"itemname\":\"222-0003\"},{\"itemname\":\"310-0456\"}" "item-category": "7" }

補足情報

どうして2カラム目のitemをjson形式にしようとしているかというと「item-category」によって登録する「item」の数量が可変するのでそれを管理したいと考えてのことです。
わざわざ複雑な管理方法にしなくてもこうすれば単純にできるよという回答があればそちらの方法でも構わないと考えております。ぜひ回答をお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

あまり良い方法ではないのかもしれませんが、Valueは全て文字列としてcategoryによって
列数を可変させることで無事にデータを格納、取得できるようです。
ただ、これが最善かは何とも言えませんが、今のところは意図していることは実現できました。

テーブルの内容

item-categoryitemcode_1itemcode_2itemcode_3itemcode_4itemcode_5
1111-0001111-0002
2222-0001222-0002222-0003
3333-0001333-0002333-0003333-0004333-0005

戻ってきた値

Response: { "item-category": "3", "itemcode_5": "333-0005", "itemcode_4": "333-0004", "itemcode_3": "333-0003", "itemcode_2": "333-0002", "itemcode_1": "333-0001" }

投稿2018/10/29 05:17

Otazoman

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問