यह हमारी Django माइग्रेशन श्रृंखला का अंतिम लेख है:
- भाग 1:Django माइग्रेशन - एक प्राइमर
- भाग 2:माइग्रेशन की गहराई में जाना
- भाग 3:डेटा स्थानांतरण (वर्तमान लेख)
- वीडियो:Django 1.7 माइग्रेशन - प्राइमर
फिर से वापस।
माइग्रेशन मुख्य रूप से आपके डेटाबेस के डेटा मॉडल को अप-टू-डेट रखने के लिए हैं, लेकिन एक डेटाबेस केवल एक डेटा मॉडल से कहीं अधिक है। सबसे विशेष रूप से, यह डेटा का एक बड़ा संग्रह भी है। इसलिए डेटा माइग्रेशन के बारे में बात किए बिना डेटाबेस माइग्रेशन की कोई भी चर्चा पूरी नहीं होगी।
12 फरवरी, 2015 को अपडेट किया गया :ऐप रजिस्ट्री से मॉडल देखने के लिए डेटा माइग्रेशन को बदल दिया।
डेटा माइग्रेशन परिभाषित
डेटा माइग्रेशन का उपयोग कई परिदृश्यों में किया जाता है। दो बहुत लोकप्रिय हैं:
- जब आप "सिस्टम डेटा" लोड करना चाहते हैं, तो आपका एप्लिकेशन सफलतापूर्वक संचालित होने के लिए मौजूद होने पर निर्भर करता है।
- जब किसी डेटा मॉडल में परिवर्तन के कारण मौजूदा डेटा को बदलने की आवश्यकता होती है।
ध्यान दें कि परीक्षण के लिए डमी डेटा लोड करना उपरोक्त सूची में नहीं है। ऐसा करने के लिए आप माइग्रेशन का उपयोग कर सकते हैं, लेकिन माइग्रेशन अक्सर प्रोडक्शन सर्वर पर चलाए जाते हैं, इसलिए आप शायद अपने प्रोडक्शन सर्वर पर डमी टेस्ट डेटा का एक गुच्छा नहीं बनाना चाहते।
उदाहरण
पिछले Django प्रोजेक्ट से जारी रखते हुए, कुछ "सिस्टम डेटा" बनाने के उदाहरण के रूप में, आइए कुछ ऐतिहासिक बिटकॉइन कीमतें बनाते हैं। Django माइग्रेशन एक खाली माइग्रेशन फ़ाइल बनाकर और अगर हम टाइप करते हैं तो उसे सही जगह पर रखकर हमारी मदद करेंगे:
$ ./manage.py makemigrations --empty historical_data
इससे historical_data/migrations/003_auto<date_time_stamp>.py
नाम की एक फ़ाइल बननी चाहिए . आइए इसका नाम बदलकर 003_load_historical_data.py
कर दें और फिर इसे खोलो। आपके पास एक डिफ़ॉल्ट संरचना होगी जो इस तरह दिखती है:
# encoding: utf8
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('historical_data', '0002_auto_20140710_0810'),
]
operations = [
]
आप देख सकते हैं कि इसने हमारे लिए एक आधार संरचना बनाई है, और यहाँ तक कि निर्भरताएँ भी डाली हैं। यह मददगार है। अब कुछ डेटा माइग्रेशन करने के लिए, RunPython
. का उपयोग करें माइग्रेशन ऑपरेशन:
# encoding: utf8
from django.db import models, migrations
from datetime import date
def load_data(apps, schema_editor):
PriceHistory = apps.get_model("historical_data", "PriceHistory")
PriceHistory(date=date(2013,11,29),
price=1234.00,
volume=354564,
total_btc=12054375,
).save()
PriceHistory(date=date(2012,11,29),
price=12.15,
volume=187947,
total_btc=10504650,
).save()
class Migration(migrations.Migration):
dependencies = [
('historical_data', '0002_auto_20140710_0810'),
]
operations = [
migrations.RunPython(load_data)
]
हम फ़ंक्शन load_data
. को परिभाषित करके प्रारंभ करते हैं जो - आपने अनुमान लगाया - डेटा लोड करता है।
एक वास्तविक ऐप के लिए हम blockchain.info पर जाना चाहते हैं और ऐतिहासिक कीमतों की पूरी सूची को हथियाना चाहते हैं, लेकिन माइग्रेशन कैसे काम करता है, यह दिखाने के लिए हम सिर्फ एक जोड़े को वहां रखते हैं।
एक बार जब हमारे पास फ़ंक्शन हो जाता है तो हम इसे अपने RunPython
. से कॉल कर सकते हैं ऑपरेशन और फिर यह फ़ंक्शन तब निष्पादित किया जाएगा जब हम ./manage.py migrate
. चलाते हैं कमांड लाइन से।
लाइन पर ध्यान दें:
PriceHistory = apps.get_model("historical_data", "PriceHistory")
माइग्रेशन चलाते समय, हमारे PriceHistory
. का वर्शन प्राप्त करना महत्वपूर्ण है मॉडल जो माइग्रेशन के उस बिंदु से मेल खाता है जहां आप हैं। जैसे ही आप माइग्रेशन चलाते हैं, आपका मॉडल (PriceHistory
) बदल सकता है, उदाहरण के लिए यदि आप बाद के माइग्रेशन में कोई कॉलम जोड़ते या हटाते हैं। यह आपके डेटा माइग्रेशन को विफल कर सकता है, जब तक कि आप मॉडल का सही संस्करण प्राप्त करने के लिए उपरोक्त पंक्ति का उपयोग नहीं करते हैं। इस पर अधिक जानकारी के लिए, कृपया यहाँ टिप्पणी देखें।
यकीनन यह syncdb
running चलाने से कहीं अधिक काम है और यह एक स्थिरता लोड कर रहा है। वास्तव में, माइग्रेशन जुड़नार का सम्मान नहीं करते हैं - जिसका अर्थ है कि वे उन्हें स्वचालित रूप से आपके लिए लोड नहीं करेंगे जैसे syncdb
होगा।
यह मुख्य रूप से दर्शन के कारण है।
जबकि आप डेटा लोड करने के लिए माइग्रेशन का उपयोग कर सकते हैं, वे मुख्य रूप से डेटा और/या डेटा मॉडल माइग्रेट करने के बारे में हैं। हमने सिस्टम डेटा लोड करने का एक उदाहरण दिखाया है, मुख्यतः क्योंकि यह एक सरल व्याख्या है कि आप डेटा माइग्रेशन कैसे सेट अप करेंगे, लेकिन कई बार, डेटा माइग्रेशन का उपयोग अधिक जटिल कार्यों के लिए किया जाता है जैसे आपके डेटा को नए डेटा मॉडल से मेल खाने के लिए बदलना।
एक उदाहरण यह हो सकता है कि यदि हमने केवल एक के बजाय कई एक्सचेंजों से कीमतों को संग्रहित करना शुरू करने का निर्णय लिया है, तो हम price_gox
जैसे फ़ील्ड जोड़ सकते हैं , price_btc
, आदि, तो हम price
. से सभी डेटा को स्थानांतरित करने के लिए माइग्रेशन का उपयोग कर सकते हैं price_btc
. पर कॉलम कॉलम।
सामान्य तौर पर जब Django 1.7 में माइग्रेशन से निपटते हैं, तो डेटाबेस को माइग्रेट करने से अलग अभ्यास के रूप में डेटा लोड करने के बारे में सोचना सबसे अच्छा है। यदि आप जुड़नार का उपयोग/लोड करना जारी रखना चाहते हैं, तो आप एक कमांड का उपयोग कर सकते हैं जैसे:
$ ./manage.py loaddata historical_data/fixtures/initial_data.json
यह फिक्स्चर से डेटा को डेटाबेस में लोड करेगा।
यह डेटा माइग्रेशन (जो शायद एक अच्छी बात है) के साथ स्वचालित रूप से नहीं होता है, लेकिन कार्यक्षमता अभी भी बनी हुई है; यह खो नहीं गया है, इसलिए यदि आपको आवश्यकता हो तो जुड़नार का उपयोग जारी रखने के लिए स्वतंत्र महसूस करें। अंतर यह है कि अब आप जरूरत पड़ने पर फिक्स्चर के साथ डेटा लोड करते हैं। यदि आप अपने यूनिट परीक्षणों के लिए परीक्षण डेटा लोड करने के लिए फिक्स्चर का उपयोग कर रहे हैं तो इसे ध्यान में रखना चाहिए।
निष्कर्ष
यह, पिछले दो लेखों के साथ, माइग्रेशन का उपयोग करते समय आपके सामने आने वाले सबसे सामान्य परिदृश्यों को शामिल करता है। बहुत अधिक परिदृश्य हैं, और यदि आप उत्सुक हैं और वास्तव में माइग्रेशन में गोता लगाना चाहते हैं, तो जाने के लिए सबसे अच्छी जगह (कोड के अलावा) आधिकारिक डॉक्स है।
यह सबसे अद्यतित है और यह समझाने का बहुत अच्छा काम करता है कि चीजें कैसे काम करती हैं। यदि कोई अधिक जटिल परिदृश्य है जिसका आप एक उदाहरण देखना चाहते हैं, तो कृपया नीचे टिप्पणी करके हमें बताएं।
याद रखें कि सामान्य स्थिति में, आप इनमें से किसी के साथ काम कर रहे हैं:
-
स्कीमा माइग्रेशन: डेटाबेस या तालिकाओं की संरचना में परिवर्तन जिसमें डेटा में कोई परिवर्तन नहीं होता है। यह सबसे आम प्रकार है, और Django आमतौर पर आपके लिए ये माइग्रेशन स्वचालित रूप से बना सकता है।
-
डेटा माइग्रेशन: डेटा में परिवर्तन, या नया डेटा लोड करना। Django इन्हें आपके लिए उत्पन्न नहीं कर सकता है। उन्हें
RunPython
. का उपयोग करके मैन्युअल रूप से बनाया जाना चाहिए प्रवास।
इसलिए वह माइग्रेशन चुनें जो आपके लिए सही हो, makemigrations
run चलाएं और फिर हर बार जब आप अपना मॉडल अपडेट करते हैं तो अपनी माइग्रेशन फ़ाइलों को अपडेट करना सुनिश्चित करें—और यह कमोबेश यही है। यह आपको अपने माइग्रेशन को अपने कोड के साथ git में संग्रहीत रखने की अनुमति देगा और यह सुनिश्चित करेगा कि आप डेटा खोए बिना अपनी डेटाबेस संरचना को अपडेट कर सकते हैं।
हैप्पी माइग्रेट!