工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

boto3を使ってDynamoDBへのクエリを投げるときに、DynamoDBの予約語や特別な文字を含むせいではまったので解決法を調べた

概要

boto3を使ってDynamoDBへのクエリを投げるときに、DynamoDBの予約語や特別な文字を含むせいでうまくいかず色々調べて解決したのでメモする。



背景と目的

boto3でDynamoDBにクエリを投げるとき、

table = boto3.resource("dynamodb").Table(テーブル名)
resp = table.query(
    Key('partition').eq("record") & Key(ソートキー).begins_with("123;456")
)

のような感じで投げる。しかし、これを実行したところ、

TypeError: 'str' object is not callable

というエラーが出てしまった。少し調べたところ、DynamoDBの予約語や特別な文字が検索条件式に入っていることが問題のようだった。うまくいかず色々調べて解決したのでメモする。



詳細

問題1: プライマリパーティションキーが予約語にかぶっている

私の使っていたテーブルは、プライマリパーティションキーが、

partition

であった。どうやら、このpartitionというものがDynamoDBの予約語にあたるらしく、怒られてしまった。

問題2: プライマリパーティションキーの値も予約語にかぶっている

さらに、検索対象のプライマリパーティションキー値が、

record

で、これもかぶっているらしい。

問題3: 検索対象のソートキーの値にセミコロンが含まれている

123;456

こんな感じの値を検索したかったのだが、こういうものはだめらしい。

解決

解決したコードを載せる。

それにしても、AWS公式のドキュメントを見てもさっぱり解決方法が分からなかった。

docs.aws.amazon.com

役に立ったのは、

zoe6120.com

だった。とても感謝。

condition = "#p = :r1 AND begins_with(sort, :x1)"

response = table.query(
    KeyConditionExpression=condition,
    ExpressionAttributeNames={ "#p": "partition" },
    ExpressionAttributeValues={":r1": "record", ":x1": "123;456"}
)



まとめと今後の課題

無事、クエリを投げられるようになった。