2011-01-13 29 views
11

Đây là loại kỳ quặc nhưng tôi sẽ cố gắng giải thích tốt nhất có thể. Tôi có 2 mô hình: một mô tả một thông điệp email (Message), một cái khác là lead lead (AffiliateLead). Khi một biểu mẫu được gửi qua trang web, hệ thống sẽ tạo ra khách hàng tiềm năng và sau đó là email. Mô hình Tin nhắn có FK tùy chọn quay lại Đầu trang. Từ các mô hình nhắn file:Tính toàn vẹn OddError trên MySQL: # 1452

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

Bây giờ, vỏ cơ bản này hoạt động:

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() 

Tuy nhiên, quan điểm hình thức bản thân thì không. Nó ném một IntegrityError khi tôi cố gắng tiết kiệm một tin nhắn trỏ đến một 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`))') 

Điều này bất chấp thực tế là quan điểm được đơn giản là lấy hình thức, tạo và lưu các AffiliateLead, sau đó tạo ra và (cố gắng) để lưu Tin nhắn. Trong thực tế, khi lỗi này được ném, tôi có thể đi vào MySQL và nhìn thấy chì mới được tạo ra. Nó thậm chí ném lỗi này trong giao diện khi tôi lại lấy dẫn từ DB ngay lập tức trước khi lưu:

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

Cuối cùng, nếu tôi ngay lập tức làm mới (tái nộp mẫu), nó hoạt động. Không có IntegrityError. Nếu tôi có Django in ra SQL nó đang làm, tôi thực sự có thể thấy rằng nó là INSERTing các AffiliateLead trước khi nó cố gắng INSERT tin nhắn, và tin nhắn INSERT đang sử dụng chính xác ID AffiliateLead. Tôi thực sự bối rối vào thời điểm này. Tôi thậm chí đã thử xử lý giao dịch thủ công không có kết quả.

Trả lời

13

Tôi không chắc chắn lý do tại sao nó xảy ra, nhưng tôi dường như đã tìm ra giải pháp. Tôi đang sử dụng miền Nam để quản lý DB; nó tạo ra các thông điệp như InnoDB và AffiliateLead như MyISAM. Thay đổi bảng AffiliateLead thành InnoDB đã kết thúc IntegrityErrors. Hy vọng điều này sẽ giúp người khác.

+0

Cảm ơn bạn, điều này đã giúp ích. Đây chính xác là những gì tôi đã thấy. Gần đây nâng cấp máy tính của tôi, tôi đoán mysql là mặc định để InnoDB bây giờ, nơi nó được sử dụng để được MyISAM vì vậy đây là hành vi rất đáng ngạc nhiên. –

+0

Tôi cũng gặp vấn đề tương tự. Tuy nhiên, trong MySQL 5.5, kiểu bảng mặc định là InnoDB. Toàn bộ trang web của tôi được xây dựng với 5.1 (và tôi vừa nâng cấp lên 5.5 trước khi chạy syncdb và loaddata trên máy của mình). Vì vậy, tôi đã nhận được thông báo lỗi tương tự (# 1452). Giải pháp là thay đổi DB Type thành MyISAM trong các tùy chọn của các thiết lập trước khi chạy db đồng bộ. Dưới đây là cách thực hiện: http://djangosaur.tumblr.com/post/357759467/django-transaction-mysql-engine-innodb –

Các vấn đề liên quan