मेरे दक्षिण प्रवास काम क्यों नहीं करते?


78

सबसे पहले, मैं अपना डेटाबेस बनाता हूं।

create database mydb;

मैं स्थापित एप्लिकेशन में "दक्षिण" जोड़ता हूं। फिर, मैं इस ट्यूटोरियल पर जाता हूं: http://south.aeracode.org/docs/tutorial/part1.html

ट्यूटोरियल मुझे ऐसा करने के लिए कहता है:

$ py manage.py  schemamigration wall --initial
>>> Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate wall

महान, अब मैं पलायन करता हूं।

$ py manage.py migrate wall

लेकिन यह मुझे यह त्रुटि देता है ...

django.db.utils.DatabaseError: (1146, "Table 'fable.south_migrationhistory' doesn't exist")

इसलिए मैं Google का उपयोग करता हूं (जो कभी काम नहीं करता। इसलिए मेरे 870 प्रश्न Stackoverflow पर पूछे जाते हैं), और मुझे यह पृष्ठ मिलता है: http://groups.google.com/group/south-users/browse_thread/thread/d4c8320821dd2ca1c

ठीक है, इसलिए मैं उस निर्देशों का पालन करता हूं

>> Drop database mydb;
>> Create database mydb;
$ rm -rf ./wall/migrations
$ py manage.py syncdb

लेकिन जब मैं सिंकबॉब चलाता हूं, तो Django टेबल का एक गुच्छा बनाता है। हां, यह south_migrationhistory टेबल बनाता है, लेकिन यह मेरे ऐप की तालिकाएँ भी बनाता है।

Synced:
 > django.contrib.admin
 > django.contrib.auth
 > django.contrib.contenttypes
 > django.contrib.sessions
 > django.contrib.sites
 > django.contrib.messages
 > south
 > fable.notification
 > pagination
 > timezones
 > fable.wall
 > mediasync
 > staticfiles
 > debug_toolbar

Not synced (use migrations):
 - 
(use ./manage.py migrate to migrate these)

कूल .... अब यह मुझसे कहता है कि इनको माइग्रेट करें तो, मैं यह करता हूं:

$ py manage.py  migrate wall
The app 'wall' does not appear to use migrations.

ठीक है, तो ठीक है। मैं प्रारंभिक माइग्रेशन में दीवार जोड़ूंगा।

$ py manage.py schemamigration wall --initial

फिर मैं प्रवास करता हूं:

$ py manage.py migrate wall

आपको पता है कि? यह मुझे यह बी.एस.

_mysql_exceptions.OperationalError: (1050, "Table 'wall_content' already exists")

क्षमा करें, यह वास्तव में मुझे नाराज कर रहा है। क्या कोई मदद कर सकता है? धन्यवाद।

मुझे काम करने और सब कुछ सही ढंग से सिंक करने के लिए दक्षिण कैसे मिलता है? केवल एक चीज जिसके बारे में मैं सोच सकता हूं कि मेरे ऐप को INSTALLED_APPS से हटा दिया जाए, फिर syncdb चलाएं, फिर इसे वापस जोड़ें।

यह बहुत बड़ा है।


6
केन का उत्तर मूल रूप से सही है जहां तक ​​समाधान जाता है, लेकिन सिर्फ यह बताने के लिए कि क्या गलत हुआ ताकि आप इससे सीख सकें: अपने पलायन को मिटाना दूसरी बार समस्या थी। एक साफ डीबी से शुरू: 1. जो भी एप्लिकेशन उनका उपयोग करते हैं, उनके लिए माइग्रेशन बनाएं, 2. सिंकडब चलाएं, 3. माइग्रेट कमांड चलाएं। अनमीटर्ड टेबल बनाने के लिए सिनकॉन्डब और दक्षिण की ओर माइग्रेटेड बनाने के लिए उपयोग करेगा। एक अंतिम बिंदु: जब syncdb आउटपुट कहता है "Not synced (उपयोग माइग्रेशन):" यह अवश्य पढ़ें कि वास्तव में इसके बाद क्या आता है। आपके आउटपुट में माइग्रेट करने के लिए कुछ भी नहीं था क्योंकि आपके पास कोई माइग्रेशन नहीं था।
गेब्रियल हर्ले

2
अपनी समस्या का गहन विश्लेषण प्रदान करने के लिए +1
फिल्प डुओनोविक्स

यदि आप कई फ़ाइलों में कक्षाओं के साथ काम कर रहे हैं, तो यदि आपके पास उन सभी में app_label है!
औरिलाबस

जवाबों:


175

जब आप पहली बार एक नए ऐप के साथ शुरू करते हैं तो दक्षिण आपको माइग्रेशन बनाने की अनुमति देता है और टेबल को डेटाबेस में अभी तक जोड़ा नहीं गया है, साथ ही डेटाबेस में पहले से ही टेबल रखने वाले लीगेसी ऐप के लिए माइग्रेशन बना रहा है। कुंजी यह जानना है कि कब क्या करना है।

आपकी पहली गलती तब थी जब आपने अपना माइग्रेशन डिलीट कर दिया था, जैसे ही आपने ऐसा किया, और फिर syncdb चलाया, Django नहीं जानता था कि आप उस ऐप को अब प्रबंधित करना चाहते थे, इसलिए उसने आपके लिए तालिकाओं का निर्माण किया। जब आपने अपना प्रारंभिक माइग्रेशन बनाया और फिर माइग्रेट किया, तो दक्षिण में टेबल बनाने की कोशिश की जा रही थी जो पहले से ही बनाई गई django और इस प्रकार आपकी त्रुटि थी।

इस बिंदु पर आपके पास दो विकल्प हैं।

  1. अपने डेटाबेस से दीवार ऐप के लिए तालिकाओं को हटाएं और फिर चलाएं $ py manage.py migrate wallयह माइग्रेशन चलाएगा और आपकी तालिकाओं का निर्माण करेगा।

  2. प्रारंभिक माइग्रेशन रन को नकली करें। $ py manage.py migrate wall 0001 --fakeयह दक्षिण को बताएगा कि आपके पास पहले से ही डेटाबेस पर टेबल हैं ताकि यह नकली हो, जो कि साउथ_ माइग्रेशनहॉस्टर टेबल में एक पंक्ति जोड़ देगा, ताकि अगली बार जब आप माइग्रेट करें तो यह पता चलेगा कि पहला माइग्रेशन पहले ही चलाया जा चुका है।

एक ब्रांड नई परियोजना और कोई डेटाबेस की स्थापना

  1. अपना डेटाबेस बनाएँ
  2. इंस्टॉल किए गए ऐप्स में दक्षिण जोड़ें
  3. syncdb चलाएं, इससे डेटाबेस में django और साउथ टेबल जुड़ जाएंगे
  4. अपने एप्लिकेशन जोड़ें
  5. प्रत्येक ऐप चलाने के लिए python manage.py schemamigration app_name --initialयह आपके ऐप के लिए प्रारंभिक माइग्रेशन फ़ाइलें बनाएगा
  6. फिर दक्षिण की ओर भागें python manage.py migrate app_nameयह डेटाबेस में तालिकाओं को जोड़ देगा।

एक विरासत परियोजना और डेटाबेस की स्थापना

  1. इंस्टॉल किए गए ऐप्स में दक्षिण जोड़ें
  2. syncdb चलाएं, इससे डेटाबेस में दक्षिण तालिकाओं को जोड़ा जाएगा
  3. आपके प्रत्येक एप्लिकेशन के चलने के लिए python manage.py schemamigration app_name --initialयह आपके प्रारंभिक माइग्रेशन बनाएगा
  4. आपके प्रत्येक एप्लिकेशन के चलने के लिए python manage.py migrate app_name 0001 --fake, यह दक्षिण को नकली बना देगा, यह उन मॉडलों के लिए डेटाबेस के लिए कुछ भी नहीं करेगा, यह सिर्फ दक्षिण_ प्रवासन सूची में रिकॉर्ड जोड़ देगा ताकि अगली बार जब आप माइग्रेशन बनाना चाहें, तो आप सभी हों सेट।

एक विरासत परियोजना और कोई डेटाबेस स्थापित करना

  1. डेटाबेस बनाएँ
  2. इंस्टॉल किए गए ऐप्स में दक्षिण जोड़ें
  3. आपके प्रत्येक एप्लिकेशन के चलने के लिए python manage.py schemamigration app_name --initialयह आपके प्रारंभिक माइग्रेशन बनाएगा
  4. syncdb चलाएं, इससे कोई भी ऐप जुड़ जाएगा जिनके डेटाबेस में माइग्रेशन नहीं हैं।
  5. फिर दक्षिण माइग्रेट चलाएं python manage.py migrateयह आपके ऐप के लिए सभी माइग्रेशन चलाएगा।

अब जब आप दक्षिण के साथ सेटअप कर रहे हैं, तो आप उन ऐप्स में मॉडल परिवर्तनों का प्रबंधन करने के लिए दक्षिण का उपयोग शुरू कर सकते हैं। चलाने के लिए सबसे आम कमांड यह है python manage.py schemamigration app_name migration_name --autoकि आपके द्वारा चलाए गए अंतिम माइग्रेशन को देखेंगे और यह परिवर्तनों को ढूंढेगा और आपके लिए माइग्रेशन फ़ाइल का निर्माण करेगा। फिर आपको बस चलाने की आवश्यकता है python manage.py migrateऔर यह आपके लिए आपके डेटाबेस को बदल देता है।

उम्मीद है की वो मदद करदे।


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

@ गैब्रिएल मैंने आपको पसंद किया और मेरे उत्तर में अधिक जानकारी जोड़ी। सहायता के लिए धन्यवाद।
केन कोचरन

1
BTW, यह आपके गैर-दक्षिण प्रोजेक्ट को लेने और साउथ को जोड़ने के लिए है, न कि साउथ अप और रनिंग का उपयोग करने वाले प्रोजेक्ट को प्राप्त करने के लिए। उन मामलों में एक syncdb और माइग्रेट आप सभी की जरूरत है चाहिए
ब्रायन

11

इसी से मुझे काम करने की चीजें मिलती हैं।

pip install South

# add 'south', to INSTALL_APPS, then
python manage.py syncdb

# For existing project + database
python manage.py convert_to_south app_name

# Thereafter, call them per model changes
python manage.py schemamigration app_name --auto
python manage.py migrate app_name

संदर्भ:

http://garmoncheg.blogspot.com/2011/08/django-how-and-why-to-use-migrations.html http://www.djangopro.com/2011/01/django-database-migration-mool -साउथ-समझाया /


8

आप जिस स्टेट्स का उपयोग कर रहे हैं, वह ट्यूटोरियल:

(यदि यह शिकायत करने में विफल रहता है कि south_migrationhistory का अस्तित्व नहीं है, तो आप साउथ स्थापित करने के बाद syncdb चलाना भूल गए ।)

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

  1. दक्षिण को जोड़ें INSTALLED_APPS
  2. दौड़ो syncdb
  3. फिर ट्यूटोरियल का पालन करें।

यानी, आपको syncdbअपने नए ऐप के लिए मॉडलों में जोड़े जाने से पहले ही चला जाना चाहिए । आपके ऐप को हटाने का आपका समाधान INSTALLED_APPSकाम करना चाहिए, लेकिन यह ध्यान देने योग्य है कि यह वास्तव में केवल एक "मूर्खतापूर्ण" काम है, जैसा कि आपने एक कदम पहले याद किया था। था syncdbचलाया जा रहा से पहले आप उस ऐप्स के लिए मॉडल तैयार किया है, तो आप काम के आसपास का उपयोग नहीं होगा।


3

बस भविष्य रेफ के लिए। यदि दक्षिण आपको कोई समस्या दे रहा है:

  1. अपने एप्लिकेशन निर्देशिकाओं से माइग्रेशन निर्देशिकाओं को निकालें
  2. अपने डेटाबेस से दक्षिण _migrations हटाएं
  3. भागो manage.py syncdb
  4. दक्षिण का उपयोग करके वापस जाएं (उदाहरण के लिए ./manage.py Convert_to_south कुछ, ./manage.py माइग्रेट करें ... ')

1

यह स्पष्ट लगता है, लेकिन मैं अत्यधिक डॉक्स पढ़ने की सलाह दूंगा।

इस प्रश्न के उत्तर को पढ़ने के बाद भी मैं यह समझने के लिए संघर्ष करता रहा कि दक्षिण को प्रभावी ढंग से कैसे उपयोग किया जाए।

जिस दिन मैंने डॉक्स पढ़ा था, उस दिन यह सब बदल गया था और आपको जितना सोचना था, उससे अधिक उपयोग करने के लिए दक्षिण सरल है।

http://south.aeracode.org/docs/about.html

http://south.aeracode.org/docs/tutorial/index.html

http://south.aeracode.org/docs/convertinganapp.html#converting-an-app

मुझे यह उपयोगी भी लगा:

http://www.djangopro.com/2011/01/django-database-migration-tool-south-explained/

और सुनिश्चित करें कि आपने जेफ एटवुड के कोडिंग हॉरर लेखों को डेटाबेस संस्करण नियंत्रण पर पढ़ा है।


+1 मैं बस इस बात पर आया कि मैं बंदर से बहुत थक गया हूं, सभी अजीब दक्षिण त्रुटियों को ठीक करता हूं। अफसोस की बात है कि दक्षिण के संबंध में बहुत मदद नहीं करते हैं। हो सकता है कि मैं सच में बैठ जाऊं और आपके कहे अनुसार डॉक्स पढ़ूं।
फिलिप ०० Phil

0

मुझे दक्षिण में काम करने और सब कुछ सही ढंग से सिंक करने के लिए कैसे मिलता है? केवल एक चीज जिसके बारे में मैं सोच सकता हूं कि मेरे ऐप को INSTALLED_APPS से हटा दिया जाए, फिर syncdb चलाएं, फिर इसे वापस जोड़ें।

मैंने अतीत में दक्षिण की परेशानियों को ठीक किया है। एक सुंदर समाधान नहीं, लेकिन बहुत प्रभावी;)

लेकिन मुख्य समस्या यह है कि आपका आदेश सही नहीं है। आपको ट्यूटोरियल से पहले सिंकबैंक चलाना चाहिए था। यह ठीक से काम करता है।

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