注文を保存する
ネットショップは、あとで探せるように、注文を1件ずつ保存します。その役目をするのが、DynamoDB の表です。
表計算ソフトとちがい、DynamoDB の項目の値は、それぞれ自分の型を名乗ります。このレッスンでは、型のついた値を、Python で読み書きする方法を学びます。
このレッスンのゴール
メモ
DynamoDB の項目を、型のついた形で読み書きすることができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 表 | 名前のついた、項目の集まり | |
| 項目 | 表の中の、1件の記録 | |
| 属性 | 項目の中の、名前のついた値 | |
| 型の文字 | 値がどんな種類かを表す記号 | S |
| 文字列セット | 重ならない文字列の集まりで、順番がない |
学生が入力するセルは、このプレビューでは空白です。
どの値も型の文字を持つ
DynamoDB の表は、項目を持ちます。項目は、属性の集まりで、各属性には名前と値があります。
値は、型の文字を1つだけキーに持つ辞書で、たとえば {"S": "ramen"} です。S は文字列、N は数です。BOOL は真か偽で、NULL は値なしです。
例: 型の文字
| 文字 | 入るもの | 例 |
|---|---|---|
| S | 文字列 | {"S": "ramen"} |
| N | 数。文字で書く | {"N": "4"} |
| BOOL | 真か偽 | {"BOOL": false} |
| NULL | 値なし | {"NULL": true} |
| SS | 文字列セット。順番は決まっていない | {"SS": ["rush", "fragile"]} |
学生が入力するセルは、このプレビューでは空白です。
実行: 項目を読む
answer = {
"Item": {
"customer": {"S": "sato"},
"gift": {"BOOL": False},
"item": {"S": "ramen"},
"note": {"NULL": True},
"order_id": {"N": "1"},
"status": {"S": "paid"},
"tags": {"SS": ["rush", "fragile"]},
"total": {"N": "4"},
}
}
item = answer["Item"]
for name in item:
kind = list(item[name].keys())[0]
print(name, "の型は", kind)
print("品物:", item["item"]["S"])
# status を表示する行を足しましょう。
数は文字で届く
DynamoDB は、数をすべて文字列で送ります。たとえば {"N": "15"} で、どの桁も書いたとおりに届きます。
使うときは、int("15") や float("2.5") で変えます。保存するときは、str で文字に戻します。
例: 数を使う
| 手順 | Python | 結果 |
|---|---|---|
| 読む | total["N"] | "15" |
| 変える | int(total["N"]) | 15 |
| 1を足す | int(total["N"]) + 1 | 16 |
| 書き戻す | {"N": str(16)} | {"N": "16"} |
学生が入力するセルは、このプレビューでは空白です。
実行: 文字と数
total = {"N": "15"}
print(total["N"] + "1")
print(int(total["N"]) + 1)
print("9" > "15", 9 > 15)
print({"N": str(16)})
# "15" を "40" に変えましょう。各行は何を表示しますか。
よくある間違い
注意
{"N": "15"} は数の15だ、と考える人が多いです。入っているのは、文字の "15" です。足すと文字がつながり、"15" + "1" は "151" になります。足し算の前に int か float で変え、書き戻すときは str を使います。
ない項目は空の答え
ない項目を求めても、エラーではありません。get_item は、Item というキーがない答えを返します。
「この注文が新しいときだけ」のような条件つきの書き込みは、拒まれることがあります。そのエラーの Code は ConditionalCheckFailedException で、状態は 400 です。取り込んだファイルでは {"error": ...} と書かれます。boto3 は、同じ Code と状態を持つ例外を出します。
実行: 見つかる、ない、拒まれる
found = {"Item": {"customer": {"S": "sato"}, "note": {"NULL": True}}}
missing = {}
refused = {"error": {"Code": "ConditionalCheckFailedException", "HTTPStatusCode": 400}}
for answer in [found, missing]:
if "Item" in answer:
print("見つかった、note は null:", answer["Item"]["note"]["NULL"])
else:
print("そのような項目はない")
print(refused["error"]["Code"], refused["error"]["HTTPStatusCode"])
# note を {"S": "ギフトカード"} に変え、["S"] で読みましょう。
クラウドラボで試す
クラウドラボは、S3、SQS、DynamoDB の練習用の複製です。バーの ラボを起動 を押してから、下の各コマンドの 実行 を押します。本物の AWS コマンドラインを使うので、同じ言葉が本物のアカウントでも通じます。最後のコマンドは何も表示しません。ない項目は、ここではエラーではなく空の返事です。この手順は練習です。下の課題はふつうの Python のままなので、ラボなしでも解けます。
作り物のキーとラボのアドレスを設定する
export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test AWS_DEFAULT_REGION=us-east-1 AWS_ENDPOINT_URL=http://cloud:4566ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
テーブルを作る
aws dynamodb create-table --table-name Orders --attribute-definitions AttributeName=customer,AttributeType=S AttributeName=order,AttributeType=S --key-schema AttributeName=customer,KeyType=HASH AttributeName=order,KeyType=RANGE --billing-mode PAY_PER_REQUEST --query TableDescription.TableStatusここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
項目を保存する
aws dynamodb put-item --table-name Orders --item '{"customer":{"S":"ada"},"order":{"S":"1001"},"total":{"N":"12"}}'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
項目を読む
aws dynamodb get-item --table-name Orders --key '{"customer":{"S":"ada"},"order":{"S":"1001"}}'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ない項目を読む
aws dynamodb get-item --table-name Orders --key '{"customer":{"S":"ada"},"order":{"S":"9999"}}'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。