Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to combine if_not_exists and list_append in update_item

I'm trying to use the update_item functionality for DynamoDB in boto3.

I'm struggling right now to update lists for items. I would like to create a new list if the list does not exist yet and otherwise append to the existing list.

Using an UpdateExpression of the form SET my_list = list_append(my_list, :my_value) returns an error "The provided expression refers to an attribute that does not exist in the item" if the list does not exist yet.

Any idea how I would have to modify my UpdateExpression?

like image 295
fabian Avatar asked Jan 22 '16 16:01

fabian


2 Answers

You can use list_append(if_not_exists()) construction.

UpdateExpression:

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

ExpressionAttributeValues:

{ ":my_value":{"L": [{"S":"test"}]}, ":empty_list":{"L":[]} }

Update: as mentioned in the comments, boto3 now raises an error for the expression above and a version without explicit types works: { ":my_value": ["test"], ":empty_list":[] }.

like image 52
Boris Serebrov Avatar answered Nov 11 '22 19:11

Boris Serebrov


An alternative to Boris solution could be to use set instead of list datatype and use the ADD keyword, it does exactly what you want.

With Add, the update expression becomes: ADD setName :s

And the expression attribute values can be like: {":s": {"SS":["First", "Second"]}}

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html#Expressions.UpdateExpressions.ADD

like image 33
Ayush Pateria Avatar answered Nov 11 '22 20:11

Ayush Pateria