如何重命名DynamoDB列/键

wek*_*ka1 4 python amazon-web-services amazon-dynamodb boto3

在我的DynamoDb表之一中,我有一个名为“状态”的列/键,事实证明这是一个保留关键字。不幸的是,不能删除整个表并重新启动它。如何重命名密钥?

这是导致异常的Lambda代码:

try :
            response = table.query(
                IndexName='myId-index',
                KeyConditionExpression=Key('myId').eq(someId)
            )
            for item in response['Items']:
                print('Updating Item: ' + item['id'])
                table.update_item(
                    Key={
                        'id': item['id']
                    },
                    UpdateExpression='SET myFirstKey = :val1, mySecondKey = :val2, myThirdKey = :val3, myFourthKey = :val4, myFifthKey = :val5, status = :val6',
                    ExpressionAttributeValues={
                        ':val1': someValue1,
                        ':val2': someValue2,
                        ':val3': someValue3,
                        ':val4': someValue4,
                        ':val5': someValue5,
                        ':val6': someValue6
                    }
                )
except Exception, e:
            print ('ok error: %s' % e)
Run Code Online (Sandbox Code Playgroud)

这是例外:

2016-06-14 18:47:24 UTC + 2 ok错误:调用UpdateItem操作时发生错误(ValidationException):无效的UpdateExpression:属性名称是保留关键字;保留关键字:状态

Shi*_*his 5

没有真正简单的方法来重命名列。您将必须为每个条目创建一个新属性,然后删除现有属性的所有值。

如果您在查询表时遇到问题,请使用Expression Attribute Names来删除属性/列。

从“ 表达式属性名称”文档中:

在某些情况下,您可能需要编写一个包含与DynamoDB保留字冲突的属性名称的表达式。要解决此问题,您可以定义一个表达式属性名称。一个表达式属性名称是一个占位符,你在表达式中使用,以替代实际的属性名称。


小智 5

有一个简单的解决方案,而不是重新命名列:在查询中使用投影表达式和表达式属性名称。

我遇到了同样的问题(我的表包含“名称”列。这是一个示例查询:

TableName: 'xxxxxxxxxx',
  ExpressionAttributeNames: {
    '#A': 'country',
    '#B': 'postcode',
    '#C': 'name'
  },
  ExpressionAttributeValues: {
    ':a': {S: 'DE'},
    ':c': {S: 'Peter Benz'}
  },
  FilterExpression: 'country = :a AND #C = :c',
  ProjectionExpression: '#A, #B, #C'
Run Code Online (Sandbox Code Playgroud)