मेरे 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 ने इसका नाम बदल दिया)
धन्यवाद यूजी। त्वरित प्रश्न: एक -delete-ghost-migrations में वास्तव में क्या होता है? क्या दक्षिण दक्षिण-माइग्रेशनटेबल से उन पंक्तियों को हटा देता है और उन्हें सही पंक्तियों से बदलता है? मैं पूछता हूं क्योंकि माइग्रेशन 0002 और 0003 में बनाए गए फ़ील्ड पहले से ही आबादी में हैं। दक्षिण उस डेटा को नहीं छोड़ देगा और इसे फिर से बनाएगा, है ना? – jchung
@ जेरेड, नहीं, यह केवल 'south_migrationhistory' तालिका को संशोधित करेगा। आपको अभी भी '--fake' निर्दिष्ट करने की आवश्यकता होगी हालांकि दक्षिण "वास्तविक" माइग्रेशन 2, 3, और 4 को लागू करने में विफल हो जाएगा क्योंकि आपका डीबी पहले से ही उन परिवर्तनों को प्रतिबिंबित करता है (या शायद और भी - लेकिन मैं आपके से नहीं बता सकता कोड नमूने अकेले) –
अद्यतन: समस्या हल हो गई! Thx – jchung