2016-01-22 16 views
28

Próbuję użyć funkcji update_item dla DynamoDB w boto3.Czy można połączyć if_not_exists i list_append w update_item

Teraz walczę o aktualizację list artykułów. Chciałbym utworzyć nową listę, jeśli lista jeszcze nie istnieje i w przeciwnym razie dołączy do istniejącej listy.

Korzystanie UpdateExpression formularza SET my_list = list_append(my_list, :my_value) zwraca błąd „Dostarczony wyrażenie odnosi się do atrybutu, który nie istnieje w pozycji” jeśli lista jeszcze nie istnieje.

Każdy pomysł, jak będę musiał zmodyfikować mój UpdateExpression?

Dzięki & pozdrawiam, Fabian

Odpowiedz

65

Można użyć list_append(if_not_exists()) konstrukcję.

UpdateExpression:

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

ExpressionAttributeValues:

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

Dzięki za podpowiedź! Dość schludne rozwiązanie. – fabian

+1

Czy masz pojęcie, czy jest to zależne od warunków wyścigu? Przeglądam dokumentację AWS i nie wydaje mi się, żebym miał jakiekolwiek blokady/transakcje (przynajmniej dla Python SDK). Z pewnością wygląda na to, że ten kod mógłby: odczytać listę z DB, b: dołączyć nową wartość, i c: nadpisać starą wartość, która _ mogła zostać zmieniona w międzyczasie. –

+0

Nie mogę znaleźć bezpośredniego potwierdzenia w dokumentacji, ale spodziewam się, że pojedyncza operacja UpdateItem będzie atomowa, najbliższa rzecz, którą znalazłem w faq - "Możesz zwiększyć lub zmniejszyć numeryczny atrybut w wierszu za pomocą pojedynczego wywołania API. Podobnie możesz atomicznie dodawać lub usuwać zestawy, listy lub mapy ", zobacz https://aws.amazon.com/dynamodb/faqs/ –