2012-09-18 4 views
17

मैं अपने मॉडलों के कुछ करने के लिए एक UUID क्षेत्र जोड़ा और फिर दक्षिण साथ माइग्रेट किए गए। मेरे द्वारा बनाई गई कोई भी नई वस्तुएं यूयूआईडी फ़ील्ड सही ढंग से आबादी में हैं। हालांकि मेरे पुराने डेटा पर यूयूआईडी फ़ील्ड शून्य है।UUID फ़ील्ड पहले से ही डेटाबेस में डेटा के बाद जोड़ा गया। क्या मौजूदा डेटा के लिए यूयूआईडी फ़ील्ड को पॉप्युलेट करने का कोई तरीका है?

वहाँ मौजूदा डेटा के लिए UUID डेटा को भरने के लिए कोई तरीका है?

उत्तर

19

निम्न नमूना वर्ग के लिए:

from django_extensions.db.fields import UUIDField 

def MyClass: 
    uuid = UUIDField(editable=False, blank=True) 
    name = models.CharField() 

आप दक्षिण उपयोग कर रहे हैं, एक डेटा प्रवास बनाएँ:

python ./manage.py datamigration <appname> --auto 

और फिर विशिष्ट तर्क के साथ माइग्रेशन अद्यतन करने के लिए निम्नलिखित कोड का उपयोग एक यूयूआईडी जोड़ने के लिए:

from django_extensions.utils import uuid 

def forwards(self, orm): 
    for item in orm['mypp.myclass'].objects.all(): 
     if not item.uuid: 
      item.uuid = uuid.uuid4() #creates a random GUID 
      item.save() 


def backwards(self, orm): 
    for item in orm['mypp.myclass'].objects.all(): 
     if item.uuid: 
      item.uuid = None 
      item.save() 

आप विभिन्न प्रकार के यूयूआईडी बना सकते हैं, प्रत्येक उत्पन्न भिन्न ntly। uuid.py module in Django-extensions UUIDs आप बना सकते हैं, की पूरी सूची है।

यह है कि यदि आप वस्तुओं की एक बहुत कुछ के साथ एक वातावरण में इस माइग्रेशन चला है, यह (उदाहरण के लिए, कपड़े का उपयोग कर यदि तैनात करने के लिए) टाइम आउट की क्षमता है ध्यान देना महत्वपूर्ण है। उत्पादन वातावरण के लिए पहले से ही मौजूदा क्षेत्रों में भरने की एक वैकल्पिक विधि की आवश्यकता होगी।

बड़ी संख्या में वस्तुओं को करने की कोशिश करते समय स्मृति से बाहर निकलना संभव है (हमने खुद को स्मृति से बाहर चलाया और 17,000+ वस्तुओं के साथ तैनाती विफल रही)।

इसके आसपास जाने के लिए, आप अपने माइग्रेशन में need to create a custom iterator (या जहां इसे वास्तव में उपयोगी है वहां चिपकाएं, और इसे अपने माइग्रेशन में देखें)। यह कुछ इस तरह दिखेगा:

def queryset_iterator(queryset, chunksize=1000): 
    import gc 
    pk = 0 
    last_pk = queryset.order_by('-pk')[0].pk 
    queryset=queryset.order_by('pk') 
    if queryset.count() < 1 
     return [] 
    while pk < last_pk: 
     for row in queryset.filter(pk__gt=pk)[:chunksize]: 
      pk = row.pk 
      yield row 
     gc.collect() 

और फिर आपके माइग्रेशन बदल जाएगा इस तरह देखने के लिए:

class Migration(DataMigration): 

    def forwards(self, orm): 
     for item in queryset_iterator(orm['myapp.myclass'].objects.all()): 
      if not item.uuid: 
       item.uuid = uuid.uuid1() 
       item.save() 

    def backwards(self, orm): 
     for item in queryset_iterator(orm['myapp.myclass'].objects.all()): 
      if item.uuid: 
       item.uuid = None 
       item.save() 
+4

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

+0

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

6

सभी मौजूदा रिकॉर्ड को UUID मूल्यों को जोड़ने के लिए पहले आप सुनिश्चित करें कि आपके मॉडल है करने की आवश्यकता होगी UUID blank=True, null=True

के साथ दायर की तो दक्षिण के साथ schemamigration कमांड चलाएं और फिर जिसके परिणामस्वरूप प्रवास फ़ाइल को खोलने के।

आप (निम्न आयात UUID

आयात करने के लिए आगे के अंत में की आवश्यकता होगी) समारोह: और फिर निम्नलिखित के रूप में इस post

उद्धरण में दिखाया गया है के साथ अपने प्रवास फ़ाइल को संपादित करें निम्नलिखित डीईएफ़ फारवर्ड (स्वयं, ORM) जोड़ें:

... 
for a in MyModel.objects.all(): 
    a.uuid = u'' + str(uuid.uuid1().hex) 
    a.save() 

के रूप में कहा गया है कि इच्छा पाश throu माइ मौजूदा प्रवास और माइग्रेशन के हिस्से के रूप में इसे एक यूआईआईडी जोड़ें।

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

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