使用boto3向DynamoDB条件插入数据时state为保留关键字报错如何解决
问题原因
DynamoDB官方维护了预留关键字列表,state属于预留关键字,直接在ConditionExpression等表达式中作为属性名使用,就会触发ValidationException报错。
可行解决方案
- 方案1:使用
ExpressionAttributeNames参数做属性名别名映射(官方推荐最优解)
该方案不需要修改现有表结构和存储的字段名,仅调整接口传参即可解决问题。修改后的代码如下:
import boto3 from botocore.exceptions import ClientError def put_items_if_doesnt_exist(): dynamodb = boto3.resource('dynamodb', region_name='us-east-1') try: table = dynamodb.Table('awssolutions-ssm-hybrid-table') response = table.put_item( Item={ 'name': 'Execution', 'state': 'Locked', }, # 条件表达式中用别名代替实际属性名 ConditionExpression='attribute_not_exists(#s) AND attribute_not_exists(#n)', # 配置别名和真实属性名的映射关系 ExpressionAttributeNames={ '#s': 'state', '#n': 'name' } ) except ClientError as e: # 忽略条件检查失败异常(代表对应item已存在) if e.response['Error']['Code'] != 'ConditionalCheckFailedException': raise
原理是表达式中使用#开头的自定义别名代表实际属性名,最后通过ExpressionAttributeNames配置别名和真实属性名的映射关系,完全不影响数据存储的字段名称。
- 方案2:修改属性名
如果当前业务还没有存量数据,可以调整表结构,将state字段修改为非保留关键字的名称,例如execution_state、lock_state等,直接避免关键字冲突问题。
内容的提问来源于stack exchange,提问作者Justin Thomas
相关产品推荐
相关产品推荐

