在文档之后,我正在尝试创建一个更新或添加的更新语句,如果在dynamodb表中只存在一个属性.
我正在尝试这个
response = table.update_item( Key={'ReleaseNumber': '1.0.179'}, UpdateExpression='SET', ConditionExpression='Attr(\'ReleaseNumber\').eq(\'1.0.179\')', ExpressionAttributeNames={'attr1': 'val1'}, ExpressionAttributeValues={'val1': 'false'} )
我得到的错误是:
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the UpdateItem operation: ExpressionAttributeNames contains invalid key: Syntax error; key: "attr1"
如果有人做了类似于我想要实现的任何事情,请分享示例.
在这里找到工作示例,非常重要的是列出表的所有索引,这将在更新之前需要额外的查询,但它的工作原理.
response = table.update_item( Key={ 'ReleaseNumber': releaseNumber, 'Timestamp': result[0]['Timestamp'] }, UpdateExpression="set Sanity = :r", ExpressionAttributeValues={ ':r': 'false', }, ReturnValues="UPDATED_NEW" )
使用boto3
网上动态稀疏的有关dynamodb更新的详细信息,因此我希望这些替代解决方案有用。
import boto3 table = boto3.resource('dynamodb').Table('my_table') # get item response = table.get_item(Key={'pkey': 'asdf12345'}) item = response['Item'] # update item['status'] = 'complete' # put (idempotent) table.put_item(Item=item)
import boto3 table = boto3.resource('dynamodb').Table('my_table') table.update_item( Key={'pkey': 'asdf12345'}, AttributeUpdates={ 'status': 'complete', }, )
原始代码示例:
response = table.update_item( Key={'ReleaseNumber': '1.0.179'}, UpdateExpression='SET', ConditionExpression='Attr(\'ReleaseNumber\').eq(\'1.0.179\')', ExpressionAttributeNames={'attr1': 'val1'}, ExpressionAttributeValues={'val1': 'false'} )
固定:
response = table.update_item( Key={'ReleaseNumber': '1.0.179'}, UpdateExpression='SET #attr1 = :val1', ConditionExpression=Attr('ReleaseNumber').eq('1.0.179'), ExpressionAttributeNames={'#attr1': 'val1'}, ExpressionAttributeValues={':val1': 'false'} )
在标记的答案中,还显示有一个范围键,因此也应将其包含在Key
。update_item方法必须查找要更新的确切记录,没有批处理更新,并且您不能将经过过滤的值范围更新为获取单个记录的条件。的ConditionExpression
是那里是有益的,使更新幂等; 也就是说,如果已经是该值,则不要更新该值。它不像sql where
子句。
关于看到的具体错误。
ExpressionAttributeNames
是要在UpdateExpression中使用的键占位符的列表,如果键是保留字,则很有用。
在文档中,“表达式属性名称必须以#开头,后跟一个或多个字母数字字符”。错误是因为代码未使用以a开头的ExpressionAttributeName,#
也未在中使用它UpdateExpression
。
ExpressionAttributeValues
是您要更新的值的占位符,并且必须以 :