DynamoDBの更新で”Invalid UpdateExpression: Attribute name is a reserved keyword;”のエラーが出た時の対処

2022.11.21

この記事は公開されてから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 の予約語はこちらから確認できます。

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
  })

まとめ

どうしても予約語と同じ属性名にしたいときなどは上記のように対応する必要がありますので覚えておきましょう。

参考

Doto3 Docs