2011-01-13 20 views
11

これは奇妙なものですが、私ができる限り説明しようとします。私は2つのモデルを持っています:1つは電子メールメッセージ(メッセージ)を表し、もう1つは販売リード(AffiliateLead)です。フォームがサイトを介して提出されると、システムはリードを生成して電子メールを送信します。メッセージモデルにはオプションの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() 

を最後に、私はすぐに更新する場合(再提出するフォームを)、それが動作します。 IntegrityErrorなし。 DjangoがSQLを印刷している場合、メッセージをINSERTする前にAffiliateLeadをINSERTしていることがわかります。また、メッセージINSERTは正しいAffiliateLead IDを使用しています。私は本当にこの時点で困っている。私は手動トランザクション処理も無駄にしようとしました。

答えて

13

なぜそれが起こったのか正確にはわかりませんが、私は解決策を見つけるようでした。私はDBを管理するためにサウスを使用しています。 InnoDBとしてメッセージを作成し、MyISAMとしてAffiliateLeadを作成しました。 AffiliateLeadテーブルをInnoDBに変更すると、IntegrityErrorsが終了しました。これが他の人に役立つことを願っています

+0

ありがとう、これは助けました。これはまさに私が見ていたものです。最近、私のコンピュータをアップグレードしたところ、MyISAMであったInnoDBにmysqlがデフォルト設定されていると思いますので、これは非常に驚くべき動作でした。 –

+0

私も同じ問題がありました。しかし、MySQL 5.5では、デフォルトのテーブルタイプはInnoDBです。私のサイト全体は5.1でビルドされていました(私のマシンではsyncdbとloaddataを実行する前に5.5にアップグレードしました)。したがって私はこの同じエラーメッセージ(#1452)を取得していました。解決策は、同期DBを実行する前に、設定のオプションでDBタイプをMyISAMに変更することでした。方法は次のとおりです:http://djangosaur.tumblr.com/post/357759467/django-transaction-mysql-engine-innodb –