Django दक्षिण - तालिका पहले से मौजूद है


188

मैं दक्षिण से शुरुआत करने की कोशिश कर रहा हूं। मेरे पास एक मौजूदा डेटाबेस था और मैंने दक्षिण ( syncdb, schemamigration --initial) को जोड़ा ।

फिर, मैंने models.pyएक फ़ील्ड जोड़ने के लिए अद्यतन किया और भाग गया ./manage.py schemamigration myapp --auto। यह क्षेत्र खोजने के लिए लग रहा था और कहा कि मैं इसके साथ आवेदन कर सकता हूं ./manage.py migrate myapp। लेकिन, ऐसा करने से त्रुटि हुई:

django.db.utils.DatabaseError: table "myapp_tablename" already exists

tablenameमें सूचीबद्ध पहली तालिका है models.py

मैं Django 1.2, दक्षिण 0.7 चला रहा हूं

जवाबों:


311

चूँकि आपके पास पहले से ही डेटाबेस में निर्मित टेबल हैं, आपको केवल प्रारंभिक माइग्रेशन को नकली के रूप में चलाने की आवश्यकता है

./manage.py migrate myapp --fake

सुनिश्चित करें कि मॉडल का स्कीमा डेटाबेस में तालिकाओं के स्कीमा के समान है।


1
मिल गया धन्यवाद। यह वास्तव में माइग्रेट है और स्कीम माइग्रेशन नहीं है, लेकिन आपका जवाब मुझे सही दिशा में मिला है।
स्टीव

1
मेरी गलती सिर्फ ओपी से आदेश की नकल की, सही कमांड ./manage.py विस्थापित MyApp --fake
अशोक

इस समाधान से मेरे मामले में समस्या हल नहीं हुई। मैंने डेटाबेस को संशोधित नहीं किया और कुछ दृश्य क्रैश कर दिए क्योंकि फ़ील्ड टेबल पर नहीं बनाई गई थी। मुझे नई संपत्ति पर टिप्पणी करनी थी, हर चीज को फिर से स्थापित करने के लिए फिर से नकली के साथ माइग्रेट करें, और दूसरी बार मैंने इसे करने की कोशिश की, जो मैंने अभी भी समझ में नहीं आया ... :)
Mc-

1
@Ashok शायद आपको यह भी निर्दिष्ट करना चाहिए schemamigrationकि जिस migrateस्थिति में हमने पहले ही संशोधन किया था उससे पहले हमें फिर से करना होगा schemamigration
पियरे डे LESPINAY

3
इससे मुझे कोई फायदा नहीं हुआ। मेरे डेटाबेस में पहले से ही एक टेबल थी, और माइग्रेशन को रोकने के बाद, अन्य टेबल्स को जोड़ने का कोई तरीका नहीं था जो फेक थे। मुझे सभी तालिकाओं को छोड़ना पड़ा और नए सिरे से शुरुआत करनी पड़ी।
शैलेन सेप 6'13

41

हालाँकि टेबल "myapp_tablename" पहले से ही मौजूद है, जो मैंने करने के बाद त्रुटि रोकना शुरू कर दिया है ।/manage.py myapp --fake को माइग्रेट करता है, DatabaseError ऐसा कोई कॉलम नहीं दिखाता: myapp_mymodel.added_field।

बिल्कुल वही समस्या है!

1. जिस माइग्रेशन नंबर की वजह से ऐसा हो रहा है , उसे पूरी तरह से जांच लें । मान लें कि यह है: 0010।

2. आप की जरूरत है:

./manage.py schemamigration myapp --add-field MyModel.added_field
./manage.py migrate myapp

यदि एक से अधिक फ़ील्ड गायब हैं, तो आपको इसे प्रत्येक फ़ील्ड के लिए दोहराना होगा।

3.अब आप नए माइग्रेशन के एक समूह के साथ उतरते हैं, इसलिए myapp / migrations (0011 और आगे अगर आपको कई फ़ील्ड जोड़ने की आवश्यकता है) से उनकी फ़ाइलों को हटा दें

4. इस पर:

./manage.py migrate myapp 0010

अब प्रयास करें ।/manage.py myapp माइग्रेट करें

यदि यह विफल नहीं होता है तो आप तैयार हैं। किसी भी क्षेत्र के लापता नहीं होने पर बस डबलचेक करें।

संपादित करें:

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

  1. पहला माइग्रेशन नकली करें:

    ./manage myapp 0001 --fake पर माइग्रेट करें

  2. बाकी माइग्रेशन के साथ रोल करें:

    ./manage myapp पर माइग्रेट करें


10

जब मैं इस त्रुटि में भाग गया, तो इसका एक अलग कारण था।

मेरे मामले में साउथ ने किसी तरह मेरे डीबी में एक अस्थायी खाली टेबल छोड़ दिया था, जिसका उपयोग _remake_table () में किया जाता है । संभवत: मैंने प्रवास को एक तरह से रोक दिया था जो मेरे पास नहीं होना चाहिए था। किसी भी मामले में, प्रत्येक अनुवर्ती नया माइग्रेशन, जब यह कहा जाता है _remake_table (), त्रुटि फेंक दिया गया था sqlite3.pypysqlite2.dbapi2.OperationalError: table "_south_new_myapp_mymodel" already exists, क्योंकि यह था कि पहले से ही मौजूद है और वहाँ होने के लिए नहीं होना चाहिए था।

_South_new बिट मुझे अजीब लग रही थी, इसलिए मैंने अपने DB को ब्राउज किया, टेबल को देखा _south_new_myapp_mymodel, मेरे सिर को खरोंच दिया, दक्षिण के स्रोत को देखा , फैसला किया कि यह कबाड़ है, टेबल को गिरा दिया, और सब कुछ ठीक था।


यह वही है जो मैंने देखा था, और मुझे यह मिला था, इससे मुझे आधे घंटे के दिमाग का दर्द बचा था। बहुत अप्रिय - लेकिन ये अस्थायी माइग्रेशन टेबल हैं, और एक असफल प्रवास के दौरान चारों ओर छोड़ दिए जाते हैं, शायद निरीक्षण के प्रयोजनों के लिए। माइग्रेशन प्रयास के दौरान कुछ db अखंडता मुद्दे के कारण मेरा हुआ।
डैनी स्टेपल

यह अधिक होने की जरूरत है! यदि आप db w / o स्कीमा लेनदेन का उपयोग कर रहे हैं, तो यह बहुत आसानी से हो सकता है
युजी 'टमिता' टॉमिता

2

यदि आपको अपने मॉडल के साथ अपने डेटाबेस से मेल न खाने की समस्या है, जैसे @pielgrzym, और आप स्वचालित रूप से डेटाबेस को माइग्रेट करना चाहते हैं ताकि नवीनतम मॉडल-थ्रू फ़ाइल से मिलान किया जा सके (और उस दौरान जुड़ने वाले किसी भी डेटा को मिटाया नहीं जाएगा migrate):

manage.py schemamigration myapp --initial
manage.py migrate myapp --fake
manage.py migrate myapp zero
manage.py migrate myapp

यह केवल आपकी नवीनतम models.pyफ़ाइल में मौजूद डेटाबेस तालिकाओं को हटाएगा और पुनः बनाएगा , इसलिए आपके डेटाबेस में पिछले syncdbs या migrates से कचरा टेबल हो सकते हैं । उन लोगों से छुटकारा पाने के लिए, इन सभी पलायन से पहले:

manage.py sqlclear myapp | manage.py sqlshell

और यदि वह अभी भी आपके डेटाबेस में चारों ओर पड़ा हुआ कुछ CRUFT छोड़ता है, तो आपको ऐसा करने से पहले एक फ़ाइल inspectdbबनानी होगी और models.pyउस से (तालिकाओं और ऐप के लिए जिसे आप साफ़ करना चाहते हैं) फ़ाइल बनाएं sqlclearऔर फिर अपने मूल मॉडल को फिर से इंस्टॉल करें --initialमाइग्रेशन बनाना और उसका माइग्रेशन करना। यह सब SQL के विशेष स्वाद के साथ खिलवाड़ से बचने के लिए है जिसे आपके डेटाबेस की आवश्यकता है।


1

Perform these steps in order may help you:

1) python manage.py schemamigration apps.appname --initial

ऊपर चरण डिफ़ॉल्ट रूप में माइग्रेशन फ़ोल्डर बनाता है।

2) python manage.py apps.appname --fake माइग्रेट करें

एक नकली प्रवास उत्पन्न करता है।

3) अजगर प्रबंधन ओस्टोमेट्री माइग्रेशन apps.appname --auto

फिर आप अपनी इच्छानुसार फ़ील्ड जोड़ सकते हैं और उपरोक्त कमांड निष्पादित कर सकते हैं।

4) python manage.py apps.appname माइग्रेट करें


1

यदि आपके पास एक मौजूदा डेटाबेस और ऐप है तो आप दक्षिण रूपांतरण कमांड का उपयोग कर सकते हैं

./manage.py convert_to_south myapp

डेटाबेस में पहले से ही कोई भी बदलाव करने से पहले इसे लागू करना होगा।

Convert_to_south कमांड केवल पूरी तरह से पहली मशीन पर काम करती है जिसे आप इसे चलाते हैं। एक बार जब आपने अपने VCS में आरंभिक माइग्रेशन कर लिया, तो आपको ./manage.py migrate myapp 0001 --fakeप्रत्येक मशीन पर चलना होगा जिसमें कोडबेस की एक प्रति है (सुनिश्चित करें कि वे पहले मॉडल और स्कीमा के साथ अद्यतित थे)। रेफरी: http://south.readthedocs.org/en/latest/convertinganapp.html


0

अस्थायी समाधान के रूप में, आप माइग्रेशन स्क्रिप्ट में तालिका निर्माण टिप्पणी कर सकते हैं।

class Migration(migrations.Migration):

    dependencies = [
        (...)
    ]

    operations = [
        #migrations.CreateModel(
        #    name='TABLE',
        #    fields=[
        #            ....
        #            ....
        #    ],
        #),
        ....
        ....

या

यदि मौजूदा तालिका में कोई पंक्तियाँ (खाली) नहीं हैं, तो नीचे दी गई तालिका को हटाने पर विचार करें। (यह फिक्स केवल तभी अनुशंसित है जब तालिका में कोई पंक्तियाँ न हों) । इसके अलावा createModel ऑपरेशन से पहले इस ऑपरेशन को सुनिश्चित करें।

class Migration(migrations.Migration):

    dependencies = [
        (...),
    ]

    operations = [
        migrations.RunSQL("DROP TABLE myapp_tablename;")
    ]

0

एक और समाधान (शायद एक अस्थायी समाधान)।

$ python manage.py sqlmigrate APP_NAME MIGRATION_NAME

जैसे।,।

$ python manage.py sqlmigrate users 0029_auto_20170310_1117

यह कच्चे sql प्रश्नों में सभी पलायन को सूचीबद्ध करेगा। आप उन प्रश्नों को चुन सकते हैं जिन्हें आप उस भाग से बचने के लिए चलाना चाहते हैं जो मौजूदा तालिका बनाता है

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