AWS DynamoDBをパーティションキーで検索するサンプルを紹介します。
DynamoDBのキーについて
まずは、簡単にDynamoDBのキーの仕組みについて説明します。
DynamoDBには主キーを作成することができます。
主キーは、単一主キーと複合主キーの2種類があります。
例えば、商品IDなどで必ず一つのものを引く場合は、単一主キーで事足ります。
しかし、商品カテゴリなどでも引きたい場合は、商品IDと商品カテゴリの複合主キーを張る必要があります。
商品カテゴリに主キーを作らなくても検索はできますが、キーが無い=全件走査が行われるということになるので、性能が著しく劣化します。
頻繁に検索に使われるカラムはキーとしましょう。
また、キーは作成できる数に制限があります。
DynamoDBでは、複合主キーで最大2つまでしかキーを張ることができません。
なので、よく考えて性能が出るようにキーを張ってやる必要があります。
複合主キーはパーティションキーとソートキーから成ります。
パーティションキーは単一で検索が可能ですが、ソートキーは単一での検索はできません。
パーティションキー+ソートキーでの検索なら可能です。
そのため、複合主キーはある程度まとまったグループで検索される場合に使用されます。
例えば、商品カテゴリなどが考えられます。
パーティションキーでDynamoDBを検索する
では、実際にパーティションキーでDynamoDBを検索するサンプルを見てみます。
サンプルはpythonで作成しています。
import boto3
from boto3.dynamodb.conditions import Key
dynamodb = boto3.resource('dynamodb')
def get_records_by_partitionKey(keyName, keyValue, tableName):
table = dynamodb.Table(tableName)
try:
response = table.query(
KeyConditionExpression=Key(keyName).eq(keyValue)
)
except Exception as e:
print('DynamoDBアイテム取得処理でエラーが発生しました。TableName={0}, Key={1}, Value={2}'.format(tableName, keyName, keyValue))
print(e)
return []
if(response['ResponseMetadata']['HTTPStatusCode'] != 200):
print('DynamoDBアイテム取得処理でエラーが発生しました。' + \
'TableName={0}, Key={1}, Value={2}, StatusCode={3}'.format(tableName, keyName, keyValue, response['ResponseMetadata']['HTTPStatusCode']))
return []
items = response["Items"]
print('get_records_by_PartitionKey戻り値={0}'.format(str(items)))
return items # 取得結果が無い場合は、空の配列を返却される
keyName, keyValue, tableNameはすべて文字列型です。