DynamoDB 式ビルダー
操作を選び、リクエストをビジュアルに構築し、正しく予約語に対応した式を、その ExpressionAttributeNames と Values とともに、AWS SDK v3、CLI、boto3、PartiQL としてコピーできます。
DynamoDB の式を手書きするとミスが起きやすい理由
DynamoDB のリクエストが分かりやすい部分で失敗することはめったにありません。失敗するのは、status が予約語で #-エイリアスが必要だったり、数値の id が文字列として送られて何にもマッチしなかったり、FilterExpression と ConditionExpression が同じ :v0 プレースホルダーを使い回していたりするためです。いずれも小さなミスですが、実行はできても誤った行を返すリクエストを生み出します — デバッグするのが最も厄介な種類のものです。
このビルダーは、型付けされたモデルからリクエスト全体を組み立てます。すべての属性名はエイリアスされ、すべての値は明示的な DynamoDB の型を持ち、キー、フィルタ、条件、更新のプレースホルダーは別々の名前空間に存在するため、構造上衝突は起こりえません。出力は型タグから生成され、テキストから推測されることはありません — 数値は数値のまま、base64 文字列はバイナリのままです。
更新式と条件付き書き込みも同じように扱われます。アトミックカウンター、if_not_exists、list_append、リストのインデックスに対する REMOVE、セットに対する ADD/DELETE、楽観的ロックの条件は、すべて1つの正しい UpdateExpression と ConditionExpression にまとめられます。PartiQL タブは正直です — プリミティブに PartiQL の形がない場合、静かに誤動作するステートメントを出力するのではなく、どれが該当するかを伝えます。
まず Query と Scan のどちらにするか選んでいますか? Query と Scan の比較 ではその違いを説明しており、 PartiQL の例 では SQL ライクな構文を詳しく解説しています。
よくある質問
ExpressionAttributeName とは何ですか。なぜ # と : のプレフィックスが必要なのですか?
DynamoDB の式は、予約語(name、status、size など)である属性名を直接参照できません。また、値のプレースホルダーは実際のデータを式の文字列の外に保ちます。そのため、すべての属性名は ExpressionAttributeNames 内で #-プレースホルダーにエイリアスされ、すべての値は ExpressionAttributeValues 内で :-プレースホルダーにエイリアスされます。このビルダーがそれらのマップを生成するので、予約語がリクエストを壊すことはありません。
なぜ値ごとに型(S、N、B…)を選ばなければならないのですか?
DynamoDB は属性レベルで型付けされています。数値の 5 は { "N": "5" }、文字列の "5" は { "S": "5" } であり、異なるアイテムにマッチする別々の値です。テキスト入力ではこれらを区別できないため、ビルダーは各値にタグを付けるよう求めます。出力される SDK、CLI、boto3、PartiQL はそのタグから生成され、テキストから推測されることはありません。そのため数値の id は数値のまま、base64 のバイナリデータはバイナリのままになります。
更新式や条件付き書き込みも構築できますか?
はい。更新は SET(if_not_exists、アトミックな +/- カウンター、list_append を含む)、REMOVE(#a[2] のようなリストのインデックスを含む)、ADD(数値またはセット)、DELETE(セットのメンバー)をカバーし、1つの UpdateExpression にまとめます。条件付き書き込みは、楽観的ロックのために Update、Put、Delete に ConditionExpression を追加します(attribute_not_exists、バージョンチェックなど)。キー条件と値条件は別々のプレースホルダー名前空間を使うため、衝突することはありません。
なぜ PartiQL では「表現できない」ことがあるのですか?
PartiQL はほとんどの読み取りと書き込みをカバーしますが、いくつかの DynamoDB のプリミティブには PartiQL の形がありません。条件付きの INSERT、セット型の ADD/DELETE 更新アクション、そして size()、list_append、if_not_exists のような関数です。リクエストでこれらのいずれかを使うと、PartiQL タブは、誤った動作を静かに行うステートメントを出力する代わりに、どの機能が表現できないかを正確に伝えます — それらには SDK、CLI、boto3 の出力を使ってください。
私のデータはブラウザの外に出ますか?
いいえ。ビルダーは完全にクライアント側で動作します — 式やコードスニペットはブラウザ内で生成され、入力した内容がサーバーに送信されることはありません。URL の「リンクをコピー」機能は、リクエストをリンク自体にシリアライズして共有やブックマークを可能にしますが、それはあなたの手元にとどまります。