django syncdb और एक अद्यतन मॉडल


86

मैंने हाल ही में अपने मॉडल को अपडेट किया है, एक बूलियनफिल्ड को इसमें जोड़ा है, हालांकि जब मैं करता हूं python manage.py syncdb, तो यह मॉडल के लिए डेटाबेस में नया फ़ील्ड नहीं जोड़ता है। मैं इसे कैसे ठीक करूं ?


17
तथ्य यह है कि Django इस तरह की एक मूलभूत चीज का समर्थन नहीं करता है बॉक्स से मुझे मॉडल बनाने के लिए इसका उपयोग करने से बिल्कुल रखा गया है। तथ्य यह है कि वे एक ओआरएम पर विचार करते हैं जो तालिका निर्माण को संभालती है, लेकिन (इन-प्लेस) टेबल संशोधन को रिलीज-गुणवत्ता नहीं माना जाता है जो मुझे पूरी तरह से Django का उपयोग करने से रोकती है।
ग्लेन मेनार्ड

3
तथ्य यह है कि Django इस तरह के शानदार ऐप प्लग-इन की अनुमति देता है, जो Django को भयानक बनाता है, और यह प्रदान करता है कि यह मूल रूप से अप्रासंगिक टेबल संशोधन के लिए अंतर्निहित समर्थन की कमी है। ऐप इंस्टॉल करना कितना मुश्किल है?
डोमिनिक रॉगर

@, अपने डिजाइन चरण के दौरान अपने मॉडल की ठीक से योजना बनाएं और आपको यह समस्या नहीं होगी। यदि आप नई सुविधाएँ जोड़ रहे हैं तो दक्षिण जैसे माइग्रेशन सूट का उपयोग करें। इन-प्लेस माइग्रेशन अक्सर जटिल होते हैं; एक सरल Django प्रबंधन कमांड वैसे भी बहुत जटिल है।
सोवियुत

जवाबों:


100

Django 1.7 से आगे

Django ने पलायन के समर्थन में बनाया है - प्रलेखन पर एक नज़र डालें

Django 1.6 और पहले के लिए

Django बॉक्स के बाहर माइग्रेशन का समर्थन नहीं करता है। Django के लिए एक प्लग करने योग्य ऐप है, जो वास्तव में हालांकि करता है, और यह बहुत अच्छा काम करता है। इसे दक्षिण कहा जाता है ।


1
नोट: मुझे कस्टम db बैकएंड (जैसे django-mssql) के साथ मॉडल का उपयोग करने के लिए साउथ का उपयोग करने में समस्या थी
डॉन

1
साउथ बहुत अच्छा है! टिप के लिए धन्यवाद
जूलियन ग्रैड

14

Django वर्तमान में स्वचालित रूप से ऐसा नहीं करता है। आपके विकल्प हैं:

  1. डेटाबेस से तालिका को गिराएं, फिर इसे syncdb का उपयोग करके नए रूप में पुन: बनाएँ।
  2. उपयोग करने वाले डेटाबेस के लिए एसक्यूएल प्रिंट करें python manage.py sql (appname), फ़ील्ड के लिए जोड़ा लाइन ढूंढें और मैन्युअल रूप से alter tableएसक्यूएल कमांड का उपयोग करके इसे जोड़ें । (यह आपको अपने वर्तमान रिकॉर्ड के लिए क्षेत्र के मूल्यों को चुनने की अनुमति भी देगा।)
  3. दक्षिण का उपयोग करें ( डोमिनिक के उत्तर के अनुसार) )।

11

इन कदमों का अनुसरण करें:

  1. डंपडेट का उपयोग करके अपने डेटा को फ़िक्चर में निर्यात करें प्रबंधन कमांड
  2. टेबल गिरा दो
  3. सिंकबॉब चलाएं
  4. लोडडेटा प्रबंधन आदेश का उपयोग करके अपने डेटा को फ़ि‍रोड से पुनः लोड करें

एक पूर्ण ड्रॉप और कुछ के लिए फिर से लोड करना चाहिए जो कि जगह में होना चाहिए? वह भयानक है।
ग्लेन मेयार्ड

3
यह एक साधारण प्रबंधन कमांड है, माइग्रेशन सूट नहीं! Django के पास यह अनुमान लगाने का कोई तरीका नहीं है कि आपका डेटा कैसे बदल गया है या इसे कैसे संरक्षित किया जाए ताकि यह जोर दे कि आप इसे स्वयं करते हैं। यदि आपको यह पसंद नहीं है, तो दक्षिण की तरह एक माइग्रेशन टूल का उपयोग करें।
सोवियुत

8

जैसा कि शीर्ष उत्तर में सुझाव दिया गया था, मैंने दक्षिण का उपयोग करने की कोशिश की , और अस्पष्ट प्रवासन त्रुटियों के साथ एक घंटे की हताशा के बाद, इसके बजाय Django Evil के साथ जाने का फैसला किया ।

मुझे लगता है कि दक्षिण की तुलना में शुरुआत करना आसान है, और यह पूरी तरह से पहली बार जब मैंने टाइप किया ./manage.py evolve --hint --execute, तो मैं इसके साथ खुश हूं।


7
लगभग एक साल से Django Evolution और South का उपयोग करने के बाद, मैं अपनी राय बदल रहा हूं। साउथ का कमाल है। लेकिन यह बहुत ही Git की तरह है इस अर्थ में आपको यह सुनिश्चित करना है कि आप वास्तव में समझते हैं कि यह कैसे काम करता है । यदि आप नेत्रहीन रूप से कमांड टाइप कर रहे हैं, तो आप पहली बार जब आप या आपकी टीम के किसी व्यक्ति से गलती करेंगे, तो आप सबसे अधिक परेशान होंगे।
दान अब्रामोव

2

हैवेंट ने थोड़ी देर में django का उपयोग किया, लेकिन मुझे याद है कि syncdb db तालिकाओं पर परिवर्तन कमांड करता है। आपको तालिका को छोड़ना होगा और फिर से चलना होगा और यह फिर से बनेगा।

संपादित करें: क्षमा करें परिवर्तन नहीं करता है।


तब यह alter tableकमांड नहीं चल रहा है , यह create tableकमांड चला रहा है ।
डोमिनिक रॉजर

अच्छी तरह से मेरे पास db में डेटा है इसलिए यह बहुत अच्छा होगा अगर मैं इस समस्या को दूर कर दूं।
हेलनार

1
मुझे लगता है कि आप कहना चाहते थे, कि syncdb doesNOT प्रदर्शन परिवर्तन आदेशों। आपको तालिका को छोड़ने की ज़रूरत नहीं है, आप मैन्युअल रूप से नए क्षेत्र को अपने वर्ग में भी जोड़ सकते हैं।
ओडीएफ येल्तसैब

हां, लेकिन सवाल syncdb के उपयोग को संदर्भित कर रहा था, इसलिए इस मामले में आपको syncdb का उपयोग करने के लिए तालिका को छोड़ना होगा या नीचे वर्णित प्लगइन का उपयोग करना होगा।
एलेक्स एच।

1
यदि आप दक्षिण से निराश हैं, तो इसके बजाय Django Evolution की कोशिश करें। मेरे लिए अच्छा काम किया। stackoverflow.com/questions/1605662/…
दान अब्रामोव


0

यदि आप Apache और MySQL के साथ Django चलाते हैं, तो makemigrations के साथ माइग्रेशन करने के बाद Apache पुनरारंभ करें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.