Open3
dynamo dbの使い方
- テーブルを確認する
aws dynamodb list-tables
- DynamoDBのデータタイプ
- S, N, B, SS, NS, BS, M, L, NULL, BOOL
- S, N, B, SS, NS, BS, M, L, NULL, BOOL
- テーブルの作成
aws dynamodb create-table --table-name bbb --attribute-definitions AttributeName=Name,AttributeType=S --key-schema AttributeName=Name,KeyType=HASH --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
- テーブルの定義を確認
aws dynamodb describe-table --table-name bbb
- テーブルの削除
aws dynamodb delete-table --table-name bbb
参考
- KeySchemaで使うHASHとRANGEは何が違うのか
- NoSql Workbenchからデータを見る時にscanとqueryがあってどちらも絞り込めるが何が違うのか
- MySqlやPostgreSqlとの違いは、テーブル構造の扱い
- partition keyが1つあれば、他のデータ構造には制約が必要なさそう
- 正規化されていないデータの扱いにはdynamoDBが向いていそう
- 後々の分析を考えると、正規化されているデータは結局必要になるとしたら、DynamoDBなら解決できるというケースにはそんなに遭遇しないのかもしれない
- websocketのawsのtutorialではdynamoDBにconnectionIdを保存しているけど、cloudformationからredisやmysqlなどより簡単に設定できるから?
- 速度面などでメリットがある?
データ形式を記述するにはCLIやマネジメントコンソールではなく、pythonなどからの方が保存して後から見直したり、再現性の観点からは良さそう
# テーブル作る
import boto3
dyn_resource = boto3.resource("dynamodb")
table_name = "TryDaxTable"
params = {
"TableName": table_name,
"KeySchema": [
{"AttributeName": "partition_key", "KeyType": "HASH"},
{"AttributeName": "sort_key", "KeyType": "RANGE"},
],
"AttributeDefinitions": [
{"AttributeName": "partition_key", "AttributeType": "N"},
{"AttributeName": "sort_key", "AttributeType": "N"},
],
"ProvisionedThroughput": {"ReadCapacityUnits": 10, "WriteCapacityUnits": 10},
}
table = dyn_resource.create_table(**params)
print(f"Creating {table_name}...")
table.wait_until_exists()
# Insert
import boto3
dyn_resource = boto3.resource("dynamodb")
table = dyn_resource.Table("TryDaxTable")
some_data = "X" * item_size
partition_key = 1
sort_key = 1
table.put_item(
Item={
"partition_key": partition_key,
"sort_key": sort_key,
}
)
# テーブルの削除
import boto3
dyn_resource = boto3.resource("dynamodb")
table = dyn_resource.Table("TryDaxTable")
print(f"Deleting {table.name}...")
table.wait_until_not_exists()
- テーブルの削除だけstuckした
- WriteCapacityUnitが関係しているかもしれない
- NoSQL Workbenchから手動で削除