boto3を用いたDynamoDBの操作(1/3)

 
前回のS3と同様にDynamoDBをbotoライブラリを用いてPythonからAWS APIを操作しました。
 
nissin-geppox.hatenablog.com

 
DynamoDBの具体的な操作として、データの読み書きや探索、バックアップなどを行いました。
 
これらで行った手順と結果をまとめていきます。

 
今回も以下のコマンドよりダウンロードしたhandsonディレクトリ内のファイルを使用しました。

$ git clone https://github.com/tomomano/learn-aws-by-coding-source-code.git


 

デプロイ

 
まず、ローカルにダウンロードしたhandsonディレクトリ内に用意されたファイルを利用するために、以下のコマンドのようにプロジェクトのディレクトリに移動しました。

$ cd learn-aws-by-coding-source-code/handson/dojo/s3


次にvenvを用いて、Pythonの依存ライブラリをインストールしました。

$ python3 -m venv .env
$ source .env/bin/activate
$ pip install -r requirement.txt

 
最後にデプロイを行いました。

$ cdk deploy

 
デプロイに成功するとターミナル上に以下のような出力が表示されます。
 

 
ここに表示されている"Cov19VaccinationDb.TableName = "以降に表示されている文字列は以降のコード実行に使用します。




 

データの読み書き

 
Jupyter Notebookを用いてプログラムをインタラクティブに実行していきます。
 
ここでは、データの書き込みや変更、削除を行いました。

 
以降、実際のコードと出力を示します。

 
まず、必要なライブラリをインポートし、dynamodbリソースを呼び出しました。

入力

import boto3
from pprint import pprint
from datetime import datetime


session = boto3.Session(profile_name="default")
ddb = session.resource("dynamodb")

 
次に、テーブル名を格納する変数を定義しました。テーブル名は先ほど表示された文字列を使用しました。

入力

table_name = "Cov19VaccinationDb-Cov19VaccinationTable07030B40-1T7E4C93IZMX3"
table = ddb.Table(table_name)

 
今回作成するデータベースは”新型コロナウィルスのワクチン接種予約システム”を想定して作成します。
 
よって、定義する属性はユーザの名前、年齢、住居地、接種回数、予約日時としました。
 
これらの属性を満たすデータを追加しました。

入力

resp = table.put_item(
    Item={
        "username": "sazae_huguta",
        "first_name": "Sazae",
        "last_name": "Huguta",
        "age": 24,
        "prefecture": "Tokyo",
        "dose": 1,
        "status": "reserved",
        "date": datetime(2021,7,20,hour=10,minute=0).isoformat(timespec="seconds"),
    }
)

 
次に、追加したデータを確認しました。

入力

resp = table.get_item(
    Key={"username": "sazae_huguta", "dose": 1}
)
pprint(resp["Item"])

出力

{'age': Decimal('24'),
 'date': '2021-07-20T10:00:00',
 'dose': Decimal('1'),
 'first_name': 'Sazae',
 'last_name': 'Huguta',
 'prefecture': 'Tokyo',
 'status': 'reserved',
 'username': 'sazae_huguta'}

この結果より、追加したデータがデータベースに存在することを確認することができました。
 
次に、要素の内容を変更しました。

入力

resp = table.update_item(
    Key={"username": "sazae_huguta", "dose": 1},
    UpdateExpression="SET prefecture = :val1",
    ExpressionAttributeValues={
        ":val1": "Aomori",
    }
)


さらに、変更した内容を確認しました。

入力

resp = table.get_item(
    Key={"username": "sazae_huguta", "dose": 1}
)
pprint(resp["Item"]["prefecture"])

出力

'Aomori'

この出力結果より、正常に要素の内容が変更されたことを確認することができました。
 
次に、接種状況をresesrvedからcompletedに変更しました。

入力

resp = table.update_item(
    Key={"username": "sazae_huguta", "dose": 1},
    UpdateExpression="SET #at1 = :val1",
    ExpressionAttributeNames={
        '#at1': 'status'
    },
    ExpressionAttributeValues={
        ":val1": "completed",
    }
)

 
最後に、要素を削除しました。

入力

resp = table.delete_item(
    Key={"username": "sazae_huguta", "dose": 1},
)

 
さらに、要素が削除されたかどうかを確認しました。

入力

resp = table.get_item(
    Key={"username": "sazae_huguta", "dose": 1},
)
if resp.get("Item"):
    print(resp.get("Item"))
else:
    print("The item with the given ID was not found!")

出力

The item with the given ID was not found!

この出力結果より、データベースから要素が削除されたことを確認することができました。