DynamoDBのPartiQLで値を取得する
ある日
SQLをDynamoDBにも叩きたいなーと思って調べていたら、 PartiQL なんてものを発見しました。どうやら、SQL互換のクエリ言語になっていて、キーバリューストアのDynamoDBに対してSQLを使えるようにしてくれるようです。
Amazon DynamoDB は SQL 互換のクエリ言語である PartiQL をサポートしており、Amazon DynamoDB でデータの選択、挿入、更新、および削除を行うことができます。PartiQL を使用すると、AWS Management Console、NoSQL Workbench、AWS Command Line Interface、および PartiQL 用の DynamoDB API を使用して、DynamoDB テーブルと簡単にやり取りを行い、アドホッククエリを実行できます。PartiQL オペレーションは、他の DynamoDB データプレーンオペレーションと同様の可用性、レイテンシー、パフォーマンスを提供します。
名前の通り、文法自体は PartiQL のドキュメントを見ればよく、他のオペレーションを同様の能力を提供してくれるとは何とも素晴らしいですね。
早速使う
import boto3
def lambda_handler(event, context):
client = boto3.client("dynamodb")
response = client.execute_statement(
Statement=statement
)
return response["Items"]
早速使ってみると、こんな画面が出ました。求めた件数に対して、一度に値が返ってきていないようです。
仕様的に、dynamoDBのページネーション機能のようで、一度に取得するのはムズカシイようでした。NextTokenなるものが返却されるので、そいつを使って、ループを回すことで値を取得できました。
try:
response = client.execute_statement(Statement=statement)
items = response["Items"]
while "NextToken" in response:
response = client.execute_statement(
Statement=statement,
NextToken=response['NextToken']
)
items += response["Items"]
return items
except Exception as e:
return None
使ってみての感想としては、結構制約が多そうかなと思いました。
- パーティションキー or ソートキー には複数のコンディションを渡せない
- WHERE句のIN演算子の中身は100個まで
- その他にも
ただ、本来SQLで複雑なことをやりたいのならRDBMSを選択するのが望ましく、ちょっと軽い作業できないかな〜という時には最適なツールだと思います。
内容に誤り等ございましたら、お気軽にご指摘ください。
Discussion