2016-01-22 6 views
28

'da liste_append'i birleştirmek mümkün mü 0Dişlevini boto3'te DynamoDB için kullanmaya çalışıyorum.if_not_exists ve update_item

Şu anda öğeler için listeleri güncellemek için mücadele ediyorum. Listenin henüz mevcut olmaması ve mevcut listeye eklenmesi durumunda yeni bir liste oluşturmak istiyorum. formun SET my_list = list_append(my_list, :my_value) bir UpdateExpression kullanma

listesi henüz yoksa "sağlanan ifade kaleminde mevcut olmayan bir özelliğine başvuruda" bir hata döndürür.

UpdateExpression sayfamı nasıl değiştirebilirim?

Teşekkür & saygılarımla, Fabian

cevap

65

Sen list_append(if_not_exists()) inşaat kullanabilirsiniz.

UpdateExpression:

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

ExpressionAttributeValues:

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

teşekkürler! Oldukça temiz bir çözüm. – fabian

+1

Bunun yarış koşullarına tabi olup olmadığı hakkında bir fikriniz var mı? AWS belgelerine bakıyorum ve herhangi bir kilitleme/işlem yok gibi görünüyorlar (en azından Python SDK için). Kesinlikle bu kod şöyle görünebilir: DB'den listeyi oku, b: yeni değeri ekle, ve c: eski değerin üzerine yaz, bu arada _could_ değiştirildi. –

+0

Dokümantasyonda doğrudan bir onay bulamıyorum, ancak tek bir UpdateItem işleminin atomik olmasını bekledim, en yakın şey sss içinde bulundu - "Tek bir API çağrısı kullanarak bir satırdaki sayısal bir özniteliği artırabilir veya azaltabilirsiniz. Benzer şekilde, kümelere, listelere veya haritalara atomik olarak ekleme veya çıkarma yapabilirsiniz ", bkz. Https://aws.amazon.com/dynamodb/faqs/ –