2015-09-20 6 views
20

मुझे उत्सुकता है कि अन्य django डेवलपर माइग्रेशन के साथ एकाधिक कोड शाखाओं (उदाहरण के लिए गिट में) का प्रबंधन कैसे करते हैं।django माइग्रेशन - एकाधिक देव शाखाओं के साथ वर्कफ़्लो

मेरे समस्या इस प्रकार है: - हम Git में एक से अधिक सुविधा शाखाओं Django माइग्रेशन के साथ उनमें से कुछ है, (उनमें से कुछ फेरबदल क्षेत्रों, या उन्हें पूरी तरह से निकालने) - जब मैं (git checkout some_other_branch के साथ) शाखाओं स्विच डेटाबेस हमेशा नया कोड प्रतिबिंबित नहीं करता है, इसलिए मैं "यादृच्छिक" त्रुटियों में चला जाता हूं, जहां एक डीबी टेबल कॉलम अब मौजूद नहीं है, आदि ...

अभी, मैं बस डीबी छोड़ देता हूं और इसे फिर से बना देता हूं, लेकिन इसका मतलब है मुझे काम को पुनरारंभ करने के लिए डमी डेटा का एक गुच्छा बनाना है। मैं फिक्स्चर का उपयोग कर सकता हूं, लेकिन यह जानने के लिए कि डेटा कहां जाता है, यह एक परेशानी है।

क्या इस उपयोग-मामले से निपटने का कोई अच्छा/साफ तरीका है? मैं सोच रहा हूं कि post-checkout गिट हुक स्क्रिप्ट आवश्यक माइग्रेशन चला सकती है, लेकिन मुझे यह भी पता नहीं है कि माइग्रेशन रोलबैक संभव है या नहीं।

+2

मुझे लगता है कि @ eliot-berriot अधिकांश परिदृश्यों को कवर करता है। असल में मैं इस मुद्दे को लिखने के लिए इस मुद्दे से प्रेरित हूं जहां मैं एक प्रस्ताव का सुझाव देता हूं: [मुझे वास्तव में Django माइग्रेशन के बारे में क्या परेशान करता है] (https://cheesecakelabs.com/blog/really-annoys-django-migrations/?utm_source=stackoverflow&utm_medium= बर्नार्डो-सवाल और utm_campaign = ब्लॉग% से 20 और utm_content = क्या-सच-गुस्सा दिलाती है मुझे-के बारे में-Django-माइग्रेशन)। और पोस्ट-चेकआउट गिट हुक प्रस्ताव के साथ इस lib को शुरू किया: [django-nomad] (https://github.com/CheesecakeLabs/django-nomad)। तुम क्या सोचते हो? – bsmaniotto

उत्तर

11

माइग्रेशन रोलबैक संभव है और आमतौर पर django द्वारा स्वचालित रूप से संभाला जाता है।

class MyModel(models.Model): 
    pass 

आप python manage.py makemigrations myapp चलाते हैं, तो यह आरंभिक माइग्रेशन स्क्रिप्ट उत्पन्न करेगा:

निम्नलिखित मॉडल को ध्यान में रखते। फिर आप प्रारंभिक माइग्रेशन को लागू करने के लिए python manage.py migrate myapp 0001 चला सकते हैं।

उसके बाद आप अपने मॉडल के लिए एक क्षेत्र को जोड़ते हैं:

class MyModel(models.Model):  
    my_field = models.CharField() 

फिर एक नया माइग्रेशन को पुनर्जीवित, और लागू यह है, तो आप अभी भी वापस प्रारंभिक अवस्था में जा सकते हैं। बस python manage.py migrate myapp 0001 चलाएं और ओआरएम पिछड़ा हो जाएगा, नया क्षेत्र हटा रहा है।

डेटा माइग्रेशन से निपटने पर यह अधिक कठिन है, क्योंकि आपको आगे और पिछड़ा कोड लिखना है। एक खाली प्रवास python manage.py makemigrations myapp --empty, के माध्यम से बनाया ध्यान में रखते आप की तरह कुछ के साथ खत्म हो जाएगा:

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 

from django.db import models, migrations 

def forward(apps, schema_editor): 
    # load some data 
    MyModel = apps.get_model('myapp', 'MyModel') 

    while condition: 
     instance = MyModel() 
     instance.save() 

def backward(apps, schema_editor): 
    # delete previously loaded data 
    MyModel = apps.get_model('myapp', 'MyModel') 

    while condition: 
     instance = MyModel.objects.get(myargs) 
     instance.delete() 

class Migration(migrations.Migration): 

    dependencies = [ 
     ('myapp', '0003_auto_20150918_1153'), 
    ] 

    operations = [ 
     migrations.RunPython(forward, backward), 
    ] 

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

हमारी टीम में, हम टक्कर से बचने के लिए एक ही समय में एक ही मॉडल पर काम करने से बचने की कोशिश करते हैं। यदि यह संभव नहीं है, और एक ही संख्या (उदाहरण के लिए 0002) के साथ दो माइग्रेशन बनाए गए हैं, आप अभी भी उनमें से एक का नाम बदल सकते हैं ताकि वे ऑर्डर बदल सकें ( dependencies विशेषता को अपडेट करना भी याद रखें माइग्रेशन क्लास आपके नए ऑर्डर में)।

आप विभिन्न सुविधाओं में एक ही समय में एक ही मॉडल के खेतों पर काम कर रहा खत्म करते हैं, तो आपको अभी भी समस्या हो जाएगा, लेकिन यह हो सकता है इसका मतलब है इन सुविधाओं से संबंधित हैं और एक भी शाखा में एक साथ संभाला जाना चाहिए।

Git-हुक भाग के लिए, यह शायद कुछ लिखने के लिए संभव है, यह मानते हुए अपनी शाखा mybranch पर हैं और एक अन्य विशेषता शाखा myfeature की जांच करना चाह:

  1. बस स्विच करने से पहले, आप की सूची डंप वर्तमान में एक अस्थायी फ़ाइल में लागू किया माइग्रेशन mybranch_database_state.txt
  2. उसके बाद, आप myfeature शाखा माइग्रेशन लागू होते हैं, यदि कोई हो
  3. तब, जब वापस mybranch जाँच, आप पुन: लागू अपने डंप फ़ाइल को देखकर पिछला डेटाबेस स्थिति ।

हालांकि, यह थोड़ा मेरे लिए hackish लगता है, और यह शायद वास्तव में ठीक से सभी स्थितियों को संभालने के लिए मुश्किल होगा: रिबेसिंग, विलय, चेरी पिकिंग, आदि

हैंडलिंग माइग्रेशन संघर्ष जब वे ऐसा लगता है मेरे लिए आसान लगता है।

4

मेरे पास इसका कोई अच्छा समाधान नहीं है, लेकिन मुझे दर्द महसूस होता है।

पोस्ट-चेकआउट हुक बहुत देर हो जाएगा। यदि आप शाखा ए पर हैं और आप शाखा बी की जांच करते हैं, और बी में ए से कम माइग्रेशन हैं, तो रोलबैक जानकारी केवल ए में है और चेकआउट से पहले चलाने की आवश्यकता है।

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

मैं Git-चेकआउट के लिए एक आवरण की कल्पना कर रहा हूँ कि:

  1. नोट्स अपने INSTALLED_APPS से प्रत्येक के लिए नवीनतम प्रवास
  2. का अनुरोध शाखा में लग रहा है और नवीनतम माइग्रेशन नोटों वहाँ
  3. प्रत्येक के लिए ऐप जहां # 1 में माइग्रेशन # 2 की तुलना में आगे आगे हैं, # 2
  4. में उच्चतम माइग्रेशन पर वापस माइग्रेट करें नई शाखा
  5. प्रत्येक ऐप के लिए जहां # 2 में माइग्रेशन थे # 1 का विज्ञापन,

प्रोग्रामिंग का एक साधारण मामला माइग्रेट करें!

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