如何将值附加到AWS DynamoDB上的list属性?

kxx*_*ing 19 python boto amazon-web-services amazon-dynamodb

我正在使用DynamoDB作为KV数据库(因为没有太多数据,我认为这很好),而'V'的一部分是列表类型(大约10个元素).有一些会话要为它添加一个新值,我找不到在1个请求中执行此操作的方法.我做的是这样的:

item = self.list_table.get_item(**{'k': 'some_key'})
item['v'].append('some_value')
item.partial_save()
Run Code Online (Sandbox Code Playgroud)

我首先请求服务器并在修改值后保存它.这不是原子的,看起来很难看.有没有办法在一个请求中执行此操作?

Las*_*sus 42

以下代码应与boto3一起使用:

table = get_dynamodb_resource().Table("table_name")
result = table.update_item(
    Key={
        'hash_key': hash_key,
        'range_key': range_key
    },
    UpdateExpression="SET some_attr = list_append(some_attr, :i)",
    ExpressionAttributeValues={
        ':i': [some_value],
    },
    ReturnValues="UPDATED_NEW"
)
if result['ResponseMetadata']['HTTPStatusCode'] == 200 and 'Attributes' in result:
    return result['Attributes']['some_attr']
Run Code Online (Sandbox Code Playgroud)

这里的get_dynamodb_resource方法只是:

def get_dynamodb_resource():
    return boto3.resource(
            'dynamodb',
            region_name=os.environ['AWS_DYNAMO_REGION'],
            endpoint_url=os.environ['AWS_DYNAMO_ENDPOINT'],
            aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'],
            aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID'])
Run Code Online (Sandbox Code Playgroud)

  • 列表项必须存在吗?或者我可以使用它,如果不存在,它将为我初始化some_attr作为一个空列表? (2认同)

mko*_*bit 7

您可以通过将UpdateItemAPI与a结合使用,在1个请求中执行此操作UpdateExpression.由于您要附加到列表,因此您将使用SET具有该list_append功能的操作:

SET 支持以下功能:

...

  • list_append (operand, operand) - 评估到添加了新元素的列表.您可以通过反转操作数的顺序将新元素附加到列表的开头或结尾.

您可以在使用Update Expressions修改项目和属性文档中看到一些此示例:

  • 以下示例将新元素添加到FiveStar评论列表中.表达式属性名称#prProductReviews ; 属性值:r是单元素列表.如果列表以前有两个元素,[0][1],然后将新的元素会[2].

    SET #pr.FiveStar = list_append(#pr.FiveStar, :r)
    
    Run Code Online (Sandbox Code Playgroud)
  • 以下示例将另一个元素添加到FiveStar审阅列表中,但这次该元素将附加到列表的开头[0].列表中的所有其他元素将被移动一个.

    SET #pr.FiveStar = list_append(:r, #pr.FiveStar)
    
    Run Code Online (Sandbox Code Playgroud)

#pr:r正在使用的属性名称和值的占位符.您可以在" 使用属性名称和值的占位符"文档中查看有关这些信息的更多信息.