2016-01-22 65 views
28

我正在尝试在boto3中为DynamoDB使用update_item功能。是否有可能在update_item中结合if_not_exists和list_append

我现在正在努力更新项目列表。如果列表尚不存在,我想创建一个新列表,否则追加到现有列表。

使用形式SET my_list = list_append(my_list, :my_value)UpdateExpression返回错误“所提供的表达指的是不存在于项目存在的属性”如果列表不存在

任何想法如何我将不得不修改我的UpdateExpression

感谢&问候, 费边

回答

65

可以使用list_append(if_not_exists())建设。

UpdateExpression:

'SET my_list2 = list_append(if_not_exists(my_list2, :empty_list), :my_value)' 

ExpressionAttributeValues:

{ ":my_value":[{"S":"test"}], ":empty_list":[] } 
+0

谢谢你的提示!非常整洁的解决方案。 – fabian

+1

你有任何想法,如果这是受竞赛条件?我正在查看AWS文档,他们似乎没有任何锁定/事务(至少对于Python SDK)。它看起来像这样的代码可以a:从数据库中读取列表,b:追加新值,c:覆盖旧值,在此期间可以更改_could_。 –

+0

我无法在文档中找到直接确认,但我希望单个UpdateItem操作是原子的,这是我在常见问题中发现的最接近的东西 - “您可以使用单个API调用在一行中增加或减少数字属性。同样,你可以原子地添加或删除设置,列表或地图“,请参阅https://aws.amazon.com/dynamodb/faqs/ –