この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
データアナリティクス事業本部の荒木です。
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
})
まとめ
どうしても予約語と同じ属性名にしたいときなどは上記のように対応する必要がありますので覚えておきましょう。