銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

DynamoDB Query APIのパラメータを生成しましょ(プレースホルダをぶっ飛ばせ)

f:id:takamints:20191104181915j:plain
photo credit: Kurayba Micro Machine via photopin (license)

AWS のNoSQLデータベース DynamoDB のテーブルを Query する場合のパラメータを生成するWebアプリをつくりました。

DynamoDBでテーブルの項目を取りだすには Query API を使いますが、このパラメータがちょっと曲者なんですよね。

属性名が予約済みのキーワードにマッチしていると条件式などに直接記述できなくて「属性名のプレースホルダ」を定義して、読み替える必要があるのです。 さらに条件式では具体的な値(文字列や数値)が直接使えず「属性値のプレースホルダ」に変換しないといけません。

実際、慣れるとたいしたことではないのですけど最初はかなり悩みました。 今でも困ってる人はいるんじゃないかと思います。

DynamoDBはよくできたサービスですけど、これ(↑)って参入障壁かもしれない。 かつて悩んで解決したので、このようなソリューションを公開する責任があるのではないだろうか?と鼻息荒く意識は高く、以下に公開する次第ですー・・・


RDB技術者のためのNoSQLガイド
秀和システム (2017-05-09)
売り上げランキング: 45,590

使い方

少しUIがしょぼいですが、徐々に改善するつもりです(ゆるして)。

左にチェックボックスがついているのは省略可能なパラメータ。最初はチェックが外れていますがチェックをつけるとサンプルで入力した内容が復活します。

各テキストボックスを編集すると即座に結果のパラメータが変化します(エラーがあると変化しないので気を付けてください)。

属性名にDynamoDBのキーワードが含まれていると属性名のプレースホルダが生成されるのを確認してみてください。

生成されたパラメータはDynamoDBのQuery APIの第一引数にそのまま指定できるJSONです。[Copy]ボタンでクリップボードにコピーできまーす。

  • TableName は必須です。テーブル名を指定します。
  • KeyConditionExpression も必須で、テーブルのキーに対する抽出条件を指定します。キー以外の属性は使えません。パーティションキーには、= しか使えません。レンジキーには、範囲指定の演算子<,<=,=,>=,>, そして、BETWEEN <s> AND <e> が使えます。両者はAND条件で組み合わせます(ORは無理)。パーティションキーの条件は省略可能です。
  • FilterExpression は、KeyConditionExpressionで抽出した結果に対してフィルターをかける機能。DynamoDBではSCANした量によって課金されますからFilterで絞っても対象外です。でもFilterはAWS側で行われるので、インターネットの転送量は絞ったほうが少なくなります。まあややこしいところですが、そのうち理解できますよ(多分)。
  • Limit は抽出する行数を指定します。
  • ProjectionExpressionSQLのSELECT句。取り出したい属性値の名称をカンマ区切りで指定します。省略すれば属性値全体を取り出します。属性名がキーワードかどうかを気にする必要はありません。

関連サイト

npm aws-node-utilSQL的な構文でDynamoDBを操作する機能を提供していますが、この度こちらにこのページで使っているWebAppを公開してるのでよろしくね。

www.npmjs.com

takamin.github.io