クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

DynamoDB の表と項目

このレッスンのあとで: DynamoDB の項目を、型のついた形で読み書きすることができる。

55分のレッスンコマンド5件クラウドラボ:AWS コマンドラインで S3 バケット、SQS キュー、DynamoDB テーブルを練習する

注文を保存する

ネットショップは、あとで探せるように、注文を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"]}

学生が入力するセルは、このプレビューでは空白です。

実行: 項目を読む

コード: python
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"]) + 116
書き戻す{"N": str(16)}{"N": "16"}

学生が入力するセルは、このプレビューでは空白です。

実行: 文字と数

コード: python
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 と状態を持つ例外を出します。

実行: 見つかる、ない、拒まれる

コード: python
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"}}'

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

このラボとソースについて: クラウドラボ:AWS コマンドラインで S3 バケット、SQS キュー、DynamoDB テーブルを練習する

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。