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)
您可以通过将UpdateItemAPI与a结合使用,在1个请求中执行此操作UpdateExpression.由于您要附加到列表,因此您将使用SET具有该list_append功能的操作:
SET支持以下功能:...
list_append (operand, operand)- 评估到添加了新元素的列表.您可以通过反转操作数的顺序将新元素附加到列表的开头或结尾.
您可以在使用Update Expressions修改项目和属性文档中看到一些此示例:
以下示例将新元素添加到FiveStar评论列表中.表达式属性名称
#pr为ProductReviews ; 属性值:r是单元素列表.如果列表以前有两个元素,[0]和[1],然后将新的元素会[2].Run Code Online (Sandbox Code Playgroud)SET #pr.FiveStar = list_append(#pr.FiveStar, :r)以下示例将另一个元素添加到FiveStar审阅列表中,但这次该元素将附加到列表的开头
[0].列表中的所有其他元素将被移动一个.Run Code Online (Sandbox Code Playgroud)SET #pr.FiveStar = list_append(:r, #pr.FiveStar)
在#pr和:r正在使用的属性名称和值的占位符.您可以在" 使用属性名称和值的占位符"文档中查看有关这些信息的更多信息.
| 归档时间: |
|
| 查看次数: |
21152 次 |
| 最近记录: |