概要
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公式のドキュメントを見てもさっぱり解決方法が分からなかった。
役に立ったのは、
だった。とても感謝。
condition = "#p = :r1 AND begins_with(sort, :x1)" response = table.query( KeyConditionExpression=condition, ExpressionAttributeNames={ "#p": "partition" }, ExpressionAttributeValues={":r1": "record", ":x1": "123;456"} )
まとめと今後の課題
無事、クエリを投げられるようになった。