これは奇妙なものですが、私ができる限り説明しようとします。私は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を使用しています。私は本当にこの時点で困っている。私は手動トランザクション処理も無駄にしようとしました。
ありがとう、これは助けました。これはまさに私が見ていたものです。最近、私のコンピュータをアップグレードしたところ、MyISAMであったInnoDBにmysqlがデフォルト設定されていると思いますので、これは非常に驚くべき動作でした。 –
私も同じ問題がありました。しかし、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 –