DynamoDBの更新で”Invalid UpdateExpression: Attribute name is a reserved keyword;”のエラーが出た時の対処
データアナリティクス事業本部の荒木です。
pythonでDynamoDBの処理をしているときに出てきたエラーが出たので、対処方法をご紹介します。
An error occurred (ValidationException) when calling the UpdateItem operation: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: table
環境
- Windows
- WSL2(Ubuntu 20.04.4 LTS)
- Python(3.8.10)
本題
エラーについて
DynamoDB には予約されているキーワードがあり、それらの単語を式の属性名として使うことができません。 DynamoDB の予約語はこちらから確認できます。
対処方法
以下のような処理を書くとschema
,table
は予約語となっているため、エラーとなってしまいます。
import boto3 dynamodb = boto3.resource("dynamodb") table = dynamodb.Table(table_name) table.update_item( Key={ 'pri_key': pri_key_name, 'sort_key': sort_key_name, }, UpdateExpression='SET schema = :schema , table = :table,' ExpressionAttributeValues={ ':schema': schema_name, ':table': table_name })
なので、上記に式内の属性名を置換することができるExpressionAttributeNames
の条件を追加します。
#文字を使用したプレースホルダーを作成し、属性名を逆参照できるようにします。
import boto3 dynamodb = boto3.resource("dynamodb") table = dynamodb.Table(table_name) table.update_item( Key={ 'pri_key': pri_key_name, 'sort_key': sort_key_name, }, UpdateExpression='SET #sc = :schema , #ta = :table' ExpressionAttributeNames= { '#sc' : 'schema', '#ta' : 'table' }, ExpressionAttributeValues={ ':schema': schema_name, ':table': table_name })
まとめ
どうしても予約語と同じ属性名にしたいときなどは上記のように対応する必要がありますので覚えておきましょう。