2011-04-05 13 views
8

यदि आप किसी ऑब्जेक्ट डेटाबेस का उपयोग करते हैं, तो आपको तब होता है जब आपको अपने ऑब्जेक्ट मॉडल की संरचना को बदलने की आवश्यकता होती है?किसी ऑब्जेक्ट डेटाबेस का उपयोग करते समय, आप अपने ऑब्जेक्ट मॉडल में महत्वपूर्ण परिवर्तन कैसे प्रबंधित करते हैं?

उदाहरण के लिए, मैं Google App Engine के साथ खेल रहा हूं। जबकि मैं अपना ऐप विकसित कर रहा हूं, मुझे एहसास हुआ है कि कुछ मामलों में, मैंने कक्षा का गलत नाम दिया है, और मैं नाम बदलना चाहता हूं। और मेरे पास दो वर्ग हैं जो मुझे लगता है कि मुझे समेकित करने की आवश्यकता है।

हालांकि, मुझे नहीं लगता कि मैं कर सकता हूं, क्योंकि क्लास का नाम सहज रूप से डेटास्टोर में बंधे हुए हैं, और उन वर्ग नामों के तहत वास्तविक डेटा संग्रहीत किया गया है।

मुझे लगता है कि डेटा स्टोरेज से ऑब्जेक्ट मॉडल को सारणित करने के "पुराने तरीके" के बारे में अच्छी बात यह है कि डेटा स्टोरेज ऑब्जेक्ट मॉडल --it के डेटा के बारे में कुछ भी नहीं जानता है। तो, आप अपना ऑब्जेक्ट मॉडल बदल सकते हैं और डाटास्टोर से डेटा को अलग-अलग लोड कर सकते हैं।

तो, सामान्य रूप से, डेटाटायर का उपयोग करते समय जो आपके डेटा मॉडल के साथ घनिष्ठ है ... आप चीजों को कैसे बदलते हैं?

उत्तर

2

यदि यह महज वर्ग नामकरण आप के बारे में चिंतित है, तो आप प्रकार (पहचानकर्ता कि डेटासंग्रह में प्रयोग किया जाता है) को बदले बिना वर्ग के नाम को बदल सकते हैं , उपरोक्त के रूप में kind() विधि को लागू करें, और इसे पुराना प्रकार का नाम वापस कर दें।

यदि आपको डेटास्टोर में डेटा के वास्तविक प्रतिनिधित्व में परिवर्तन करने की आवश्यकता है, तो आपको पुराने डेटा को अपडेट करने के लिए mapreduce चलाने की आवश्यकता होगी।

1

उसी तरह आप रिलेशनल डेटाबेस में यह करते हैं, एक अच्छा सरल SQL स्क्रिप्ट के बिना छोड़कर: http://code.google.com/appengine/articles/update_schema.html

इसके अलावा, बस पुराने दिनों की तरह, गुण के बिना वस्तुओं स्वचालित रूप से डिफ़ॉल्ट और गुण है कि नहीं है नहीं मिलता है स्कीमा में मौजूद है अभी भी वस्तुओं में प्रेत के रूप में चारों ओर लटका।

किसी संपत्ति का नाम बदलने के लिए, मुझे उम्मीद है कि आप पुरानी संपत्ति को हटा सकते हैं (प्रेत चारों ओर लटकता है) नया नाम जोड़ता है, पुराने (प्रेत) संपत्ति से प्रतिलिपि के साथ डेटा को पॉप्युलेट करता है। फिर से लिखा वस्तु केवल नए संपत्ति होगा

0

आप इसे जिस तरह से हम हमारे परियोजना में कर रहे हैं ऐसा करने में सक्षम हो सकता है:

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

class Foo(db.Model): 
    @classmethod 
    def kind(cls): 
    return 'Bar' 

आप अपने वर्ग का नाम बदलना चाहते हैं: