6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ARISE analyticsAdvent Calendar 2023

Day 10

Python×DynamoDB:初心者向け簡単チュートリアル

Last updated at Posted at 2023-12-10

はじめに

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)の使い方について解説します。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?