2012-01-16 8 views
23

मेरे Django ऐप के मॉडल में कुछ बदलाव किए और दक्षिण में उन्हें अपनी विकास मशीन (माइग्रेशन 0004 से 000 9) पर माइग्रेट करने के लिए इस्तेमाल किया। लेकिन सर्वर पर इन परिवर्तनों को माइग्रेट करने का प्रयास करते समय, मुझे "GhostMigrations" त्रुटि मिलती है।Django दक्षिण GhostMigrations अपवाद क्या है और आप इसे कैसे डिबग करते हैं?

कोई भूत माइग्रेशन क्या है, या किसी को डीबग करने का तरीका बताते हुए बहुत अच्छी सामग्री नहीं है। Google इस पर सहायक नहीं था और भूत माइग्रेशन का उल्लेख करने वाले अन्य SO प्रश्नों में यह शामिल नहीं है (सबसे उपयोगी प्रश्न here अधिकतर वर्कफ़्लो के बारे में था)। डीजेंगो-दक्षिण आईआरसी में सहायक लोगों ने भूत माइग्रेशन के बारे में यह कहना था: "इसका मतलब है दक्षिण का इतिहास (डीबी में एक तालिका) दो माइग्रेशन रिकॉर्ड करता है जो इसे लगता है कि लागू किया गया है, लेकिन जिनकी माइग्रेशन फाइलें इसे" । मैं अब डीबग को पूरा करने का तरीका जानने का प्रयास कर रहा हूं।

सहायता के लिए अग्रिम धन्यवाद। ,

Traceback (most recent call last): 
    File "manage.py", line 14, in <module> 
    execute_manager(settings) 
    File "/home/username/webapps/myproject/lib/python2.6/django/core/management/__init__.py", line 438, in execute_manager 
    utility.execute() 
    File "/home/username/webapps/myproject/lib/python2.6/django/core/management/__init__.py", line 379, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/username/webapps/myproject/lib/python2.6/django/core/management/base.py", line 191, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/home/username/webapps/myproject/lib/python2.6/django/core/management/base.py", line 220, in execute 
    output = self.handle(*args, **options) 
    File "/home/username/lib/python2.6/South-0.7.3-py2.6.egg/south/management/commands/migrate.py", line 105, in handle 
    ignore_ghosts = ignore_ghosts, 
    File "/home/username/lib/python2.6/South-0.7.3-py2.6.egg/south/migration/__init__.py", line 171, in migrate_app 
    applied = check_migration_histories(applied, delete_ghosts, ignore_ghosts) 
    File "/home/username/lib/python2.6/South-0.7.3-py2.6.egg/south/migration/__init__.py", line 88, in check_migration_histories 
    raise exceptions.GhostMigrations(ghosts) 
south.exceptions.GhostMigrations: 

! These migrations are in the database but not on disk: 
    <bodyguard: 0002_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie> 
    <bodyguard: 0003_auto__del_field_asset_is_reserved__add_field_asset_is_assigned> 
! I'm not trusting myself; either fix this yourself by fiddling 
! with the south_migrationhistory table, or pass --delete-ghost-migrations 
! to South to have it delete ALL of these records (this may not be good). 

मैं देखना है कि दक्षिण माइग्रेशन 0002 और 0003 के बारे में शिकायत हैरान था क्योंकि मैं उन परिवर्तनों महीने पहले बनाया:

यहाँ त्रुटि है।

0001_initial.py 
0001_initial.pyc 
0002_auto__chg_field_asset_username__chg_field_asset_title__chg_field_asset.py 
0002_auto__chg_field_asset_username__chg_field_asset_title__chg_field_asset.pyc 
0003_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie.py 
0003_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie.pyc 
0004_auto__del_field_asset_is_reserved__add_field_asset_is_assigned.py 
0004_auto__del_field_asset_is_reserved__add_field_asset_is_assigned.pyc 
0005_auto__add_assetedit.py 
0005_auto__add_assetedit.pyc 
0006_auto__del_field_assetedit_user__add_field_assetedit_asset.py 
0006_auto__del_field_assetedit_user__add_field_assetedit_asset.pyc 
0007_auto__chg_field_assetedit_update_date.py 
0007_auto__chg_field_assetedit_update_date.pyc 
0008_auto__add_field_asset_activated_date.py 
0008_auto__add_field_asset_activated_date.pyc 
0009_auto__del_field_asset_activated_date__add_field_asset_activation_date.py 
0009_auto__del_field_asset_activated_date__add_field_asset_activation_date.pyc 
__init__.py 
__init__.pyc 

यह:

class Asset(models.Model): 
    title = models.CharField(max_length=200, blank=True, null=True) 
    user = models.ForeignKey(User, blank=True, null=True) 
    is_assigned = models.NullBooleanField(blank=True, null=True) 
    is_created = models.NullBooleanField(blank=True, null=True) 
    is_active = models.NullBooleanField(blank=True, null=True) 
    activation_date = models.DateTimeField(default=datetime.datetime.now, blank=True, null=True) 

class AssetEdit(models.Model): 
    asset = models.ForeignKey(Asset, related_name="edits", blank=True, null=True) 
    update_date = models.DateTimeField(default=datetime.datetime.now, blank=True, null=True) 

यहाँ दक्षिण माइग्रेशन फ़ोल्डर की सामग्री हैं: परिवर्तन मैंने पहले आज बनाया 0009.

यहाँ के माध्यम से परिवर्तन किया गया है 0004 अपने मॉडल है दक्षिण_मिशनटेबल है:

id | app_name |         migration         |   applied    
----+-----------+-----------------------------------------------------------------------------+------------------------------- 
    1 | myapp  | 0001_initial                | 2011-10-14 22:07:11.467184-05 
    2 | myapp  | 0002_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie | 2011-10-14 22:07:11.469822-05 
    3 | myapp  | 0003_auto__del_field_asset_is_reserved__add_field_asset_is_assigned   | 2011-10-14 22:07:11.471799-05 
(3 rows) 

यह myapp_asset तालिका है, क्योंकि यह वर्तमान में खड़ा है:

        Table "public.myapp_asset" 
    Column |   Type   |       Modifiers       
-------------+------------------------+-------------------------------------------------------------- 
id   | integer    | not null default nextval('myapp_asset_id_seq'::regclass) 
title  | character varying(200) | 
user_id  | integer    | 
is_assigned | boolean    | 
is_created | boolean    | 
is_active | boolean    | 
Indexes: 
    "myapp_asset_pkey" PRIMARY KEY, btree (id) 
    "myapp_asset_user_id" btree (user_id) 
Foreign-key constraints: 
    "myapp_asset_user_id_fkey" FOREIGN KEY (user_id) REFERENCES auth_user(id) DEFERRABLE INITIALLY DEFERRED 

मैं समझ नहीं क्यों Django दक्षिण माइग्रेशन 0002 और 0003 समझता है "भूत" किया जाना है। उनमें से दोनों माइग्रेशन फ़ोल्डर में हैं, माइग्रेशनटेबल में "लागू" के रूप में सूचीबद्ध हैं, और डेटाबेस माइग्रेशन 0003 के बाद एंड-स्टेट के साथ संगत है।

(संभावित त्रुटियां: माइग्रेशन फ़ोल्डर को शामिल किया गया था गिट रेपो; माइग्रेशन 0002 ने एक विशेषता बनाई, और उसके बाद 0003 ने इसका नाम बदल दिया)

उत्तर

23

किसी भी तरह, आपके डेटाबेस ने माइग्रेशन 0002 और 0003 रिकॉर्ड किया है जो इसे आपके माइग्रेशन फ़ोल्डर में नहीं ढूंढ सकता है। अपने फाइल सिस्टम में

प्रवासन 00020002_auto__chg_field_asset_username__chg_field_asset_title__chg_field_asset.py है, जबकि यह इतिहास तालिका में में 0002_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie.py

दक्षिण की ओर पलायन किया गया होगा जब आपके माइग्रेशन फोल्डर में विभिन्न सामग्री के लिए किया था (विकास में शायद?)।

आप क्या कह रहे हैं के आधार पर, यह मेरे लिए लग रहा है अपने डेटाबेस की तरह पलायन 0004 पर राज्य को दर्शाता है, तो मैं एक python manage.py migrate myapp 0004 --fake --delete-ghost-migrations जो बिंदु आप is_assigned फ़ील्ड जोड़ी पर प्रवास तालिका सेट हो जाएगा चलाने चाहते हैं, और आप खुशी से माइग्रेशन 0005+ लागू कर सकते हैं।

आप वर्तमान डीबी तालिका को माइग्रेशन करना चाहते हैं, तो मैच होना चाहिए!

+0

धन्यवाद यूजी। त्वरित प्रश्न: एक -delete-ghost-migrations में वास्तव में क्या होता है? क्या दक्षिण दक्षिण-माइग्रेशनटेबल से उन पंक्तियों को हटा देता है और उन्हें सही पंक्तियों से बदलता है? मैं पूछता हूं क्योंकि माइग्रेशन 0002 और 0003 में बनाए गए फ़ील्ड पहले से ही आबादी में हैं। दक्षिण उस डेटा को नहीं छोड़ देगा और इसे फिर से बनाएगा, है ना? – jchung

+1

@ जेरेड, नहीं, यह केवल 'south_migrationhistory' तालिका को संशोधित करेगा। आपको अभी भी '--fake' निर्दिष्ट करने की आवश्यकता होगी हालांकि दक्षिण "वास्तविक" माइग्रेशन 2, 3, और 4 को लागू करने में विफल हो जाएगा क्योंकि आपका डीबी पहले से ही उन परिवर्तनों को प्रतिबिंबित करता है (या शायद और भी - लेकिन मैं आपके से नहीं बता सकता कोड नमूने अकेले) –

+0

अद्यतन: समस्या हल हो गई! Thx – jchung

7

वे भूत माइग्रेशन माना जाता है क्योंकि डेटाबेस में नाम:

0002_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie 
0003_auto__del_field_asset_is_reserved__add_field_asset_is_assigned 

नामों और आपके द्वारा सूची मेल नहीं खाते:

0003_auto__add_field_asset_is_reserved__add_field_asset_is_created__add_fie.py 
0004_auto__del_field_asset_is_reserved__add_field_asset_is_assigned.py 

संख्या फ़ाइल नाम का हिस्सा हैं और पूरी तरह से मेल खाना चाहिए । मुझे यकीन नहीं है कि आप इस राज्य तक कैसे पहुंचे, लेकिन यदि आप पूरी तरह से सुनिश्चित हैं कि आपकी डीबी आपकी 0004 फ़ाइल में क्या है, तो आप दक्षिण डीबी तालिका में 0002_auto__chg_field_asset_username__chg_field_asset_title__chg_field_asset जोड़ सकते हैं, फिर दो पंक्तियों को अपडेट करें ताकि संख्याएं आपके फ़ाइल नाम से मेल खा सकें।

यह कहने की जरूरत नहीं है कि आपको ऐसा करने से पहले सबकुछ वापस लेना चाहिए।

+0

माइग्रेशन फ़ोल्डर में वर्णित पहले माइग्रेशन रन (0001initial) में माइग्रेशन 0001 और 0002 दोनों शामिल हैं। यह समझाएगा कि प्रवासन संख्या सिंक से क्यों निकली। स्पष्ट रूप से मेरे वर्कफ़्लो में एक त्रुटि। तो अगर मैं सिर्फ डेटाबेस में पंक्तियों को ठीक करता हूं, जो दक्षिण को वापस सिंक में रखेगा, है ना? फिर यह तय करने के बाद, क्या मैं माइग्रेशन 000 9 (जहां मैं प्राप्त करने की कोशिश कर रहा हूं) पर आगे बढ़ने के लिए फिर से "माइग्रेट" चलाऊंगा? – jchung

+0

हां, या माइग्रेट माइग्रेट करें - उस बिंदु पर माइग्रेशन करें जिसे आप जानते हैं कि आपका डेटाबेस वर्तमान में '--delete-ghost-migrations' तर्क के साथ भूत माइग्रेशन का प्रतिनिधित्व करता है और हटा देता है। –

+0

अद्यतन: समस्या हल हो गई! धन्यवाद – jchung

संबंधित मुद्दे