2011-01-13 2 views
11

이것은 이상한 것 같지만 가능한 최선을 다해 설명하려고 노력할 것입니다. 저는 2 가지 모델을 가지고 있습니다 : 하나는 이메일 메시지 (메시지)를 대표하고, 다른 하나는 판매 리드 (AffiliateLead)입니다. 양식이 사이트를 통해 제출되면 시스템에서 리드를 생성 한 다음 전자 메일을 보냅니다. Message 모델에는 선택적 FK가 리드에 있습니다.MySQL의 홀수 IntegrityError : # 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() 

그러나, 양식보기 자체는하지 않습니다. 내가 AffiliateLead을 가리키는 메시지를 저장하려고하면 그것은 IntegrityError가 발생합니다 :

(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에 가서 새로 만든 리드를 볼 수 있습니다. 그것은 심지어 내가하면 바로 저장하기 전에 DB에서 리드를 다시 검색 뷰에서이 오류가 발생합니다 :

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

을 마지막으로, 나는 즉시 새로 고침 경우 (재 제출하는 양식), 그것을 작동합니다. 무결성 오류가 없습니다. Django가 SQL을 인쇄하면 Message를 INSERT하기 전에 AffiliateLead를 INSERT하고 Message INSERT가 올바른 AffiliateLead ID를 사용하고 있음을 볼 수 있습니다. 나는이 시점에서 정말로 곤란하다. 나도 수동 트랜잭션 처리를 사용해 보았습니다.

답변

13

왜 그런지 정확히 모르겠지만 해결책을 찾은 것 같습니다. DB를 관리하기 위해 South를 사용하고 있습니다. 그것은 InnoDB와 AffiliateLead라는 메시지를 MyISAM으로 만들었습니다. AffiliateLead 테이블을 InnoDB로 변경하면 IntegrityErrors가 종료됩니다. 희망이 다른 사람을 도와줍니다.

+0

감사합니다. 도움이되었습니다. 이것은 정확히 내가 본 것입니다. 최근에 내 컴퓨터를 업그레이드했는데, MyISAM이던 곳에서 mysql이 기본값으로 InnoDB를 기본값으로 설정 한 것 같습니다. 그래서 이것은 매우 놀랍습니다. –

+0

나는 또한이 동일한 문제가 있었다. 다만, MySQL 5.5에서는, 디폴트의 테이블 형은 InnoDB입니다. 내 전체 사이트는 5.1로 구축되었습니다 (그리고 syncdb 및 loaddata를 실행하기 전에 5.5로 업그레이드했습니다). 따라서 나는이 오류 메시지 (# 1452)를 얻고있었습니다. 해결책은 sync db를 실행하기 전에 설정의 옵션에서 DB Type을 MyISAM으로 변경하는 것이 었습니다. 방법은 다음과 같습니다. http://djangosaur.tumblr.com/post/357759467/django-transaction-mysql-engine-innodb –