🕌
boto3のclientでDynamoDBを操作してみた
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",},
)
データの挿入
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個までです。
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グループは、「エネルギー革命」を技術革新により推進し、より良い世界を創出することをミッションとするエネルギーベンチャー企業です。 enechange.co.jp/
Discussion