2016-01-22 10 views
28

Sto provando a utilizzare la funzionalità update_item per DynamoDB in boto3.È possibile combinare if_not_exists e list_append in update_item

Al momento sto facendo fatica ad aggiornare gli elenchi per gli articoli. Vorrei creare una nuova lista se la lista non esiste ancora e altrimenti aggiungere all'elenco esistente.

Utilizzando un UpdateExpression della forma SET my_list = list_append(my_list, :my_value) restituisce un errore "l'espressione fornita si riferisce a un attributo che non esiste nella voce" se l'elenco non esiste ancora.

Qualche idea su come dovrei modificare il mio UpdateExpression?

Grazie & migliori saluti, Fabian

risposta

65

È possibile utilizzare list_append(if_not_exists()) costruzione.

UpdateExpression:

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

ExpressionAttributeValues:

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

Grazie per il suggerimento! Soluzione abbastanza carina. – fabian

+1

Avete qualche idea se questo è soggetto a condizioni di gara? Sto esaminando la documentazione di AWS e non sembrano avere alcun blocco/transazione (almeno per l'SDK di Python). Sembra certamente che questo codice possa: leggere l'elenco dal DB, b: aggiungere il nuovo valore e c: sovrascrivere il vecchio valore, che _could_ è stato modificato nel frattempo. –

+0

Non riesco a trovare una conferma diretta nella documentazione, ma mi aspetterei che l'operazione Single UpdateItem fosse atomica, la cosa più vicina che ho trovato in faq: "È possibile incrementare o decrementare un attributo numerico in una riga utilizzando una singola chiamata API. Allo stesso modo, puoi aggiungere o rimuovere atomicamente insiemi, elenchi o mappe ", vedi https://aws.amazon.com/dynamodb/faqs/ –

Problemi correlati