2016-01-22 52 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())建設を使用することができます。

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

ExpressionAttributeValues:

UpdateExpression

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

ヒントをありがとう:ADD setName :s

そして表現の値は次のようにすることができ、属性!かなりきちんとした解決策。 – fabian

+1

これは競争条件の対象であるかどうか分かりますか?私はAWSのドキュメントを見ていますが、少なくともPython SDKではロック/トランザクションがないようです。確かに、このコードはDBからリストを読み込み、b:新しい値を追加し、c:はその間に変更された古い値を上書きします。 –

+0

私はドキュメントで直接確認を見つけることができませんが、私は、単一のUpdateItem操作をアトミックにすることを期待しています。私はfaqで見つかった最も近い事柄です - "単一のAPI呼び出しを使用して行の数値属性を増減できます。同様に、セット、リスト、またはマップにアトミックに追加または削除することもできます」https://aws.amazon.com/dynamodb/faqs/ –

関連する問題