DynamoDBのスキャン時に「Attribute name is a reserved keyword; reserved keyword: type」が出る


DynamoDBのスキャン時に「Attribute name is a reserved keyword; reserved keyword: type」が出る時の対処法です。 カラム名にDynamoDBの予約語が使われていると出ました。

具体的にはテーブルに以下のようなアイテムを追加し、type でスキャンするとエラーが起きました。

aws dynamodb put-item \
--table-name pokemon-table \
--item '{ "number": { "N": "143" }, "name": { "S": "Snorlax" }, "type": { "S": "Normal" } }'
aws dynamodb scan \
--table-name pokemon-table \
--filter-expression 'type = :tp' \
--expression-attribute-values '{ ":tp": { "S": "Normal" } }'
An error occurred (ValidationException) when calling the Scan operation: Invalid FilterExpression: Attribute name is a reserved keyword; reserved keyword: type

expression-attribute-names を使い、type に別名を付けることで回避できました。

aws dynamodb scan \
--table-name pokemon-table \
--filter-expression '#tp = :tp' \
--expression-attribute-values '{ ":tp": { "S": "Normal" } }' \
--expression-attribute-names '{"#tp":"type"}'

そもそも予約語をカラム名にしない方が良いのかもしれません。