2015-07-08 13 views
8

मैं डायनेमोडीबी को के-वी डीबी के रूप में उपयोग कर रहा हूं (क्योंकि इसमें बहुत अधिक डेटा नहीं है, मुझे लगता है कि यह ठीक है), और 'वी' का हिस्सा सूची प्रकार (लगभग 10 तत्व) है। इसमें एक नया मूल्य जोड़ने के लिए कुछ सत्र है, और मुझे 1 अनुरोध में ऐसा करने का कोई तरीका नहीं मिल रहा है। क्या मैंने किया था इस तरह है:AWS DynamoDB पर विशेषता विशेषता सूची के लिए मूल्य कैसे जोड़ना है?

item = self.list_table.get_item(**{'k': 'some_key'}) 
item['v'].append('some_value') 
item.partial_save() 

मैं पहली बार सर्वर अनुरोध और बचाने के बाद यह मूल्य संशोधित। यह परमाणु नहीं है और बदसूरत लग रहा है। क्या एक अनुरोध में ऐसा करने का कोई तरीका है?

उत्तर

3

UpdateExpression के साथ UpdateItem एपीआई का उपयोग करके आप इसे 1 अनुरोध में कर सकते हैं।

SET निम्नलिखित कार्यों का समर्थन करता है: चूंकि आप एक सूची संलग्न करना चाहते हैं, तो आप list_append समारोह के साथ SET कार्रवाई का प्रयोग करेंगे

...

  • list_append (operand, operand) - एक का मूल्यांकन इसमें एक नया तत्व जोड़ा गया है। आप नए तत्व को स्टार्ट या ऑपरेंड के ऑर्डर को उलटकर सूची के अंत में जोड़ सकते हैं।

आप Modifying Items and Attributes with Update Expressions documentation पर इस के कुछ उदाहरण देख सकते हैं:

  • निम्न उदाहरण FiveStar समीक्षा सूची में एक नया तत्व जोड़ता है। अभिव्यक्ति विशेषता नाम #prउत्पाद समीक्षा; विशेषता मान :r एक तत्व सूची है। यदि सूची में पहले दो तत्व थे, [0] और [1], तो नया तत्व [2] होगा।

    SET #pr.FiveStar = list_append(#pr.FiveStar, :r) 
    
  • निम्न उदाहरण FiveStar समीक्षा सूची में एक और तत्व को जोड़ता है, लेकिन इस बार तत्व [0] पर सूची की शुरुआत से जोड़ दिए जाएंगे। सूची में मौजूद सभी अन्य तत्वों को एक स्थानांतरित कर दिया जाएगा।

    SET #pr.FiveStar = list_append(:r, #pr.FiveStar) 
    

#pr और :r विशेषता नाम और मान के लिए प्लेसहोल्डर का उपयोग कर रहे हैं। आप Using Placeholders for Attribute Names and Values documentation पर उन लोगों के बारे में अधिक जानकारी देख सकते हैं।

+0

लेकिन मैं Boto में किसी भी एपीआई नहीं मिला ... – kxxoling

24

निम्नलिखित कोड boto3 साथ काम करना चाहिए:

table = get_dynamodb_resource().Table("table_name") 
result = table.update_item(
    Key={ 
     'hash_key': hash_key, 
     'range_key': range_key 
    }, 
    UpdateExpression="SET some_attr = list_append(some_attr, :i)", 
    ExpressionAttributeValues={ 
     ':i': [some_value], 
    }, 
    ReturnValues="UPDATED_NEW" 
) 
if result['ResponseMetadata']['HTTPStatusCode'] == 200 and 'Attributes' in result: 
    return result['Attributes']['some_attr'] 

यहाँ get_dynamodb_resource विधि बस है:

def get_dynamodb_resource(): 
    return boto3.resource(
      'dynamodb', 
      region_name=os.environ['AWS_DYNAMO_REGION'], 
      endpoint_url=os.environ['AWS_DYNAMO_ENDPOINT'], 
      aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'], 
      aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID']) 
+0

धन्यवाद! यह पूरी तरह से काम करता है। हालांकि मैंने एडीडी का उपयोग करने की कोशिश की लेकिन यह काम नहीं किया। मैंने दस्तावेज़ों में पढ़ा है कि वे एडीडी का उपयोग करने की सलाह देते हैं। जब मैंने एडीडी का उपयोग करने की कोशिश की, तो मुझे UpdateExression में ऑपरेटर मिस्चैच त्रुटि मिली। – kishorer747

+0

बहुत उपयोगी! क्षमा करें, मैं केवल +1 कर सकता हूं :( – vnpnlz

+0

क्या सूची आइटम मौजूद है? या क्या मैं इसका उपयोग कर सकता हूं और यदि यह अस्तित्व में नहीं है तो यह खाली सूची के रूप में मेरे लिए कुछ_attr init करेगा? – Jonathan

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