2011-01-13 7 views
11

यह एक अजीब तरह का है लेकिन मैं जितना संभव हो उतना समझाने की कोशिश करूंगा। मेरे पास 2 मॉडल हैं: एक ईमेल संदेश (संदेश) का प्रतिनिधित्व करता है, दूसरा एक बिक्री लीड (AffiliateLead)। जब साइट के माध्यम से एक फॉर्म जमा किया जाता है, तो सिस्टम एक लीड और फिर ईमेल उत्पन्न करता है। संदेश मॉडल में लीड पर एक वैकल्पिक एफके वापस है।MySQL पर विषम इंटीग्रटी त्रुटि: # 1452

lead = models.ForeignKey('tracking.AffiliateLead', blank=True, null=True) 

अब, यह बुनियादी खोल काम करता है:: संदेश मॉडल फ़ाइल से

from tracking.models import Affiliate, AffiliateLead 
from messages.models import Message 
from django.contrib.auth.models import User 

u = User.objects.get(username='testguy') 
a = Affiliate.objects.get(affiliate_id = 'ACD023') 
l = AffiliateLead(affiliate = a) 
l.save() 
m = Message(recipient=u, sender=u, subject='s', body='a', lead=l) 
m.save() 

हालांकि, प्रपत्र दृश्य ही नहीं करता है। यह एक IntegrityError फेंकता है जब मैं एक संदेश है कि एक AffiliateLead के लिए अंक को बचाने की कोशिश:

(1452, 'Cannot add or update a child row: a foreign key constraint fails (`app`.`messages_message`, CONSTRAINT `lead_id_refs_id_6bc546751c1f96` FOREIGN KEY (`lead_id`) REFERENCES `tracking_affiliatelead` (`id`))') 

इस तथ्य यह है कि दृश्य बस, प्रपत्र ले जा रहा है बनाने और AffiliateLead बचत, तो बनाने और के बावजूद है (कोशिश कर) संदेश को बचाने के लिए। वास्तव में, जब यह त्रुटि फेंक दी जाती है, तो मैं MySQL में जा सकता हूं और नव निर्मित लीड देख सकता हूं। यह भी ध्यान में रखते हुए इस त्रुटि फेंकता है जब मैं डीबी से नेतृत्व तुरंत सहेजने से पहले पुनर्प्राप्त: अंत में, (पुनः सबमिट प्रपत्र)

af_lead = AffiliateLead.objects.get(id = af_lead.id) 
msg.lead = af_lead 
msg.save() 

अगर मैं तुरंत ताज़ा करते हैं, यह काम करता है। कोई ईमानदारी नहीं है। अगर मेरे पास डीजेंगो एसक्यूएल को प्रिंट कर रहा है, तो मैं वास्तव में देख सकता हूं कि यह संदेश को शामिल करने से पहले एफिलिएट लेड को घुमा रहा है, और संदेश INSERT सही संबद्ध टेक्स्ट आईडी का उपयोग कर रहा है। मैं वास्तव में इस बिंदु पर फंस गया हूँ। मैंने मैन्युअल लेनदेन हैंडलिंग का कोई फायदा नहीं लिया है।

उत्तर

13

मुझे बिल्कुल यकीन नहीं है कि ऐसा क्यों हुआ, लेकिन मुझे एक समाधान मिल गया। मैं डीबी का प्रबंधन करने के लिए दक्षिण का उपयोग कर रहा हूं; इसने मैसेसम के रूप में संदेश को InnoDB और AffiliateLead के रूप में बनाया। AffilioLead तालिका को InnoDB में बदलने से IntegrityErrors समाप्त हो गया। मनाइए कि यह किसी और के लिए सहायक हो।

+0

धन्यवाद, इससे मदद मिली। यह वही है जो मैं देख रहा था। हाल ही में मेरे कंप्यूटर को अपग्रेड किया गया, मुझे लगता है कि MySQL अब InnoDB को डिफॉल्ट कर रहा है, जहां यह MyISAM होता था, इसलिए यह बहुत ही आश्चर्यजनक व्यवहार था। –

+0

मुझे भी यही समस्या थी। हालांकि, MySQL 5.5 में डिफ़ॉल्ट तालिका प्रकार InnoDB है। मेरी पूरी साइट 5.1 के साथ बनाई गई थी (और मैंने अपनी मशीन पर सिंकडीबी और लोडडाटा चलाने से पहले 5.5 तक अपग्रेड किया था)। इसलिए मुझे यह वही त्रुटि संदेश मिल रहा था (# 1452)। समाधान सिंक डीबी चलाने से पहले सेटिंग्स के विकल्पों में डीबी प्रकार को MyISAM में बदलना था। यहां बताया गया है: http://djangosaur.tumblr.com/post/357759467/django-transaction-mysql-engine-innodb –

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