माइग्रेशन रोलबैक संभव है और आमतौर पर 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
की जांच करना चाह:
- बस स्विच करने से पहले, आप की सूची डंप वर्तमान में एक अस्थायी फ़ाइल में लागू किया माइग्रेशन
mybranch_database_state.txt
- उसके बाद, आप
myfeature
शाखा माइग्रेशन लागू होते हैं, यदि कोई हो
- तब, जब वापस
mybranch
जाँच, आप पुन: लागू अपने डंप फ़ाइल को देखकर पिछला डेटाबेस स्थिति ।
हालांकि, यह थोड़ा मेरे लिए hackish लगता है, और यह शायद वास्तव में ठीक से सभी स्थितियों को संभालने के लिए मुश्किल होगा: रिबेसिंग, विलय, चेरी पिकिंग, आदि
हैंडलिंग माइग्रेशन संघर्ष जब वे ऐसा लगता है मेरे लिए आसान लगता है।
मुझे लगता है कि @ 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