はじめに
AWS DynamoDBは、スケーラブルで柔軟性が高く、パフォーマンスに優れたNoSQLデータベースサービスです。Pythonと組み合わせることで、開発者は効率的かつパワフルなデータハンドリングを実現できます。
しかし、PythonとDynamoDBの組み合わせに関する解説記事は少なく、ハードルが高いかもしれません。
よって本記事ではPythonを使ったAWS DynamoDBの基本的な利用方法をわかりやすく紹介します。
また「Python×AWSのDB」の解説記事は全3つを予定しており、いずれもARISE analyticsアドベントカレンダーに登録予定です。内容はPython×DAX(DynamoDB Accelerator)とPython×Elasticache Redisを予定しています。
内容
事前準備
まずDynamoDBにアクセスするために、AWSのアカウントのアクセスキーとシークレットキーを環境変数に設定します。
$ export AWS_ACCESS_KEY_ID={アクセスキー}
$ export AWS_SECRET_ACCESS_KEY={シークレットキー}
環境変数を設定しない場合は、プログラムにAWSのアクセスキーとシークレットキーを記載する必要があるので危険ですし、プログラム記述量が増えるので手間が増えてしまいます。
DynamoDBとの接続
boto3
というライブラリを用いてDynamoDBと接続を行います。
まずboto3
をインストールします。
(仮想環境)% pip install boto3
次にboto3
を用いてDynamoDBのテーブルに接続します。
import boto3
table_name = 'テーブル名'
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(table_name)
ちなみにEC2からの作業だと、VPCエンドポイントが設定されていない場合はインターネットゲートウェイを用いてDynamoDBに接続されます。
DynamoDBへの書き込み
DynamoDBに書き込みを行います。
プログラムは以下です。
from decimal import Decimal
def convert_floats_to_decimals(obj):
"""
float->Decimalに変換する関数
"""
if isinstance(obj, list):
return [convert_floats_to_decimals(x) for x in obj]
elif isinstance(obj, dict):
return {k: convert_floats_to_decimals(v) for k, v in obj.items()}
elif isinstance(obj, float):
return Decimal(str(obj))
else:
return obj
data = {'Id':1, 'value': 3.5} #保存したいデータ
data = convert_floats_to_decimals(data) #float->Decimalに変換
table.put_item(Item=value) #DynamoDBへ書き込み
DynamoDBの書き込みでの注意点は以下2つです。
プライマリーキーを必ずセットする
float
型のデータはDecimal
に型変換して保存する
これでデータの書き込みができたので、次は読み込みの方法に移ります。
DynamoDBの読み込み
DynamoDBのデータの読み込みを行います。
プライマリーキーを用いてデータを取得します。(今回はプライマリーキーをId
とします。)
プログラムは以下です。
from decimal import Decimal
def convert_decimals_to_floats(obj):
"""
Decimal->floatに変換する関数
"""
if isinstance(obj, list):
return [convert_decimals_to_floats(x) for x in obj]
elif isinstance(obj, dict):
return {k: convert_decimals_to_floats(v) for k, v in obj.items()}
elif isinstance(obj, Decimal):
return float(obj)
else:
return obj
key ={'Id': '1'} #プライマリーキーはId
response = table.get_item(Key=key) #DynamoDBの読み込み
response = convert_decimals_to_floats(response) #Decimal->float変換
おわりに
いかがだったでしょうか。
上記のようにDynamoDBはPythonで簡単に扱うことができます!
参考になれば幸いです。
次回はDynamoDBより高速であるDAX(DynamoDB Accelerator)の使い方について解説します。