🕌

boto3のclientでDynamoDBを操作してみた

2023/06/18に公開

boto3は、Amazon Web Services (AWS)をPythonから操作するためのライブラリです。
PythonでDynamoDBを操作したい際にboto3のclientを使う方法を下記にまとめます。

DynamoDBクライアントの作成

以下のコードでDynamoDBのクライアントを作成します。

import boto3

client = boto3.client('dynamodb')

テーブルの作成

create_table

以下のコードでDynamoDBのテーブルを作成します。
今回は、your_tableというテーブルに areaとnameで一意になる属性がある仕様です。


tabele_name = "your_table"

client.create_table(
    TableName=table_name,
    KeySchema=[
	{"AttributeName": "area", "KeyType": "HASH",},
	{"AttributeName": "name", "KeyType": "RANGE",},
    ],
    AttributeDefinitions=[
	{"AttributeName": "area", "AttributeType": "S"},
	{"AttributeName": "name", "AttributeType": "S"},
    ],
    BillingMode="PAY_PER_REQUEST",
)

update_time_to_live

TTLも設定します。

client.update_time_to_live(
   TableName=table_name,
   TimeToLiveSpecification={"Enabled": True, "AttributeName": "ttl",},
)

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/howitworks-ttl.html

データの挿入

put_item

以下のコードでテーブルにデータを挿入します。

from datetime import datetime, timedelta

area = "エリア1"
name = "名前1"
ttl = str(int((datetime.now() + timedelta(days=30)).timestamp()))

client.put_item(
    TableName=tablename,
    Item={
             "area": {"S": area},
             "name": {"S": name},
             "ttl": {"N": ttl},
         }
)

batch_write_item

複数のitemをまとめて登録したい場合はbatch_write_itemが使えます。
ただし一度に登録できるitemは25個までです。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb/client/batch_write_item.html

items = []
names = ["名前1", "名前2", "名前3", "名前4"]

for name in names:
    items.append(
	{
	    "PutRequest": {
		"Item": {
		    "area": {"S": area},
		    "name": {"S": name},
		    "ttl": {"N": ttl},
		}
	    }
	}
    )

dynamodb_possible_item_count = 25
for i in range(0, len(items), dynamodb_possible_item_count):
    client.batch_write_item(
	RequestItems={
	    table_name: items[i : i + dynamodb_possible_item_count]
	}
    )

データの取得

get_item

get_itemは指定された主キーを持つitemを1つ返却します。
今回はareaとnameで一意になるので、両方を指定します。
ちなみに片方しか指定しないと下記のエラーになります。

botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the GetItem operation: The provided key element does not match the schema

以下のコードでデータを取得します。

response = client.get_item(
        TableName=table_name,
        Key={
            'area': {
                'S': area
            },
            'name': {
                'S': name
            }
        }
    )

print(response['Item'])

取得したデータは以下のような形式になります。

{
    'name': {'S': '名前1'}, 
    'ttl': {'N': '1687934679'}, 
    'area': {'S': 'エリア1'}
}

query

area="エリア1"の全ての項目を取得したいときはqueryを使います。

res = client.query(
        TableName=table_name,
        KeyConditionExpression="area = :area",
        ExpressionAttributeValues={":area": {"S": "エリア1"}},
    )

print(response["Items"])

取得したデータは以下のような形式になります。

[
    {
        'name': {'S': '名前1'}, 
	'ttl': {'N': '1687934679'}, 
	'area': {'S': 'エリア1'}
    }, 
    {
        'name': {'S': '名前2'}, 
	'ttl': {'N': '1687934679'}, 
	'area': {'S': 'エリア1'}
    }, 
    {
        'name': {'S': '名前3'}, 
	'ttl': {'N': '1687934679'}, 
	'area': {'S': 'エリア1'}
    },
    {
        'name': {'S': '名前4'}, 
	'ttl': {'N': '1687934679'}, 
	'area': {'S': 'エリア1'}
    },
ENECHANGE

Discussion