当前位置:  开发笔记 > 编程语言 > 正文

dynamodb boto3中update_item的示例

如何解决《dynamodbboto3中update_item的示例》经验,为你挑选了3个好方法。

在文档之后,我正在尝试创建一个更新或添加的更新语句,如果在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"

如果有人做了类似于我想要实现的任何事情,请分享示例.



1> Dmitry R..:

在这里找到工作示例,非常重要的是列出表的所有索引,这将在更新之前需要额外的查询,但它的工作原理.

response = table.update_item(
    Key={
        'ReleaseNumber': releaseNumber,
        'Timestamp': result[0]['Timestamp']
    },
    UpdateExpression="set Sanity = :r",
    ExpressionAttributeValues={
        ':r': 'false',
    },
    ReturnValues="UPDATED_NEW"
)



2> Ryan Tuck..:

使用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',
    },
)


尽管像这样使用AttributeUpdates是正确的并且应该仍然可以工作(并且我更喜欢语法而不是UpdateExpression),但是文档中提到该方法是旧方法(因此在某个时间点可能不再起作用)。来源:https://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html#DynamoDB.Table.update_item
AttributeUpdates似乎更干净。:(

3> Davos..:

原始代码示例:

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 是您要更新的值的占位符,并且必须以 :

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有