2016-05-05 8 views
8

का उपयोग करके एक डायनामोडब तालिका में सशर्त रूप से एक आइटम कैसे डालूं यदि मेरे पास उपयोगकर्ता आईडी की हैश कुंजी और उत्पाद की एक श्रृंखला कुंजी है, तो मैं केवल उस तालिका में एक आइटम कैसे डालूं यदि यह पहले से मौजूद नहीं है boto3 की डायनेमोड बाइंडिंग का उपयोग कर?मैं boto3

साधारण कॉल put_item को लग रहा है इस

table.put_item(Item={'userId': 1, 'productId': 2}) 

एक ConditionExpression के साथ मेरा कॉल इस तरह दिखता है जैसे:

table.put_item(
    Item={'userId': 1, 'productId': 2}, 
    ConditionExpression='userId <> :uid AND productId <> :pid', 
    ExpressionAttributeValues={':uid': 1, ':pid': 3} 
) 

लेकिन यह एक ConditionalCheckFailedException हर बार उठता है। चाहे एक आइटम एक ही उत्पाद के साथ मौजूद है या नहीं।

उत्तर

22

प्रलेखन इस के लिए पर मैं dynamodb2 overwrite parameter उपयोग कर रहा हूँ दुर्भाग्य से सुपर स्पष्ट नहीं है। मैं क्या मेरे लिए काम किया है कुछ इसी तरह पूरा करने के लिए की जरूरत है, और यहाँ, boto3 का उपयोग कर:

try: 
    table.put_item(
     Item={ 
      'foo':1, 
      'bar':2, 
     }, 
     ConditionExpression='attribute_not_exists(foo) AND attribute_not_exists(bar)' 
    ) 
except botocore.exceptions.ClientError as e: 
    # Ignore the ConditionalCheckFailedException, bubble up 
    # other exceptions. 
    if e.response['Error']['Code'] != 'ConditionalCheckFailedException': 
     raise 

अन्य जवाब देने के लिए इसी प्रकार, कुंजी attribute_not_exists समारोह में है, लेकिन यह मेरे लिए स्पष्ट नहीं शुरू में है कि प्राप्त करने के लिए था काम। कुछ प्रयोग के बाद, मैं इसे ऊपर के साथ जाने में सक्षम था।

1

मुझे लगता है कि यह है कि आप boto3 documentation से client.put_item का उपयोग कर बेहतर प्रलेखन मिल जाएगा बजाय table.put_item

:

किसी मौजूदा आइटम की जगह से एक नया आइटम को रोकने के लिए, एक सशर्त अभिव्यक्ति का उपयोग जिसमें attribute_not_exists फ़ंक्शन के लिए विभाजन कुंजी के रूप में उपयोग की जाने वाली विशेषता के नाम के साथ फ़ंक्शन शामिल है। चूंकि प्रत्येक रिकॉर्ड में उस विशेषता को अवश्य होना चाहिए, इसलिए attribute_not_exists फ़ंक्शन केवल तभी सफल होगा जब कोई मेल खाने वाला आइटम मौजूद न हो।

ConditionExpression:

ConditionExpression (स्ट्रिंग) - एक शर्त यह है कि एक सशर्त PutItem आपरेशन सफल होने के लिए क्रम में संतुष्ट होना चाहिए।

कार्य::

कोई व्यंजक निम्न में से किसी को शामिल कर सकते attribute_exists | attribute_not_exists | attribute_type | में शामिल हैं start_with | आकार ये फ़ंक्शन नाम केस-संवेदी हैं।

item.save()

+0

अच्छा ... मैंने प्रलेखन पढ़ा है। लेकिन मुझे एक शर्त अभिव्यक्ति को गैर-सहज ज्ञान युक्त लिखने में मिला है और मुझे चिंता है कि जिस तरह से मैंने लिखा है वह ऐसा नहीं कर रहा है जो मुझे लगता है कि यह कर रहा है। तो सोच रहा था कि किसी और ने वास्तव में इसे पहले किया था। क्या आपके पास इसका उदाहरण है कि आपने इसे कैसे किया है? मैं अपना जवाब दिखाऊंगा कि मैंने इसे कैसे किया है – aychedee

+0

मैंने जवाब में जोड़ा कि मैं इसे कैसे करता हूं .. (ओवरराइट का उपयोग करके) –

+0

आह ठीक है ... वह बोटो का उपयोग कर रहा है। मैं boto3 के बारे में पूछ रहा हूँ। लेकिन देखने के लिए समय लेने के लिए धन्यवाद। – aychedee

संबंधित मुद्दे