2011-01-13 10 views
11

Esto es algo raro, pero trataré de explicar lo mejor que pueda. Tengo 2 modelos: uno que representa un mensaje de correo electrónico (mensaje), y el otro un cliente potencial de ventas (AffiliateLead). Cuando se envía un formulario a través del sitio, el sistema genera una guía y luego envía un correo electrónico. El modelo de mensaje tiene un FK opcional de vuelta al líder. Desde el archivo de modelos Mensaje:Odd IntegrityError en MySQL: # 1452

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

Ahora bien, esta estructura básica funciona:

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

Sin embargo, la propia opinión de la forma no lo hace. Se lanza una IntegrityError cuando trato de guardar un mensaje que apunta a un 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`))') 

Esto a pesar del hecho de que la vista es simplemente tomar la forma, crear y guardar la AffiliateLead, a continuación, crear y (tratar) para guardar el mensaje De hecho, cuando se produce este error, puedo acceder a MySQL y ver el nuevo cliente potencial creado. Incluso se lanza este error en la vista cuando me volver a recuperar la ventaja de la BD inmediatamente antes de guardar:

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

Por último, si inmediatamente restauro (re-enviar el formulario), funciona. Sin IntegrityError. Si hago que Django imprima el SQL que está haciendo, puedo ver que está INSERTANDO el AffiliateLead antes de intentar INSERTAR el Mensaje, y el Mensaje INSERT está usando el ID de AffiliateLead correcto. Estoy realmente perplejo en este punto. Incluso he intentado el manejo manual de transacciones en vano.

Respuesta

13

No estoy exactamente seguro de por qué sucedió, pero parecía encontrar una solución. Estoy usando el sur para administrar el DB; creó Mensajes como InnoDB y AffiliateLead como MyISAM. Al cambiar la tabla AffiliateLead por InnoDB finalizó IntegrityErrors. Espero que esto ayude a alguien más.

+0

Gracias, esto ayudó. Esto es exactamente lo que estaba viendo. Hace poco actualicé mi computadora, supongo que mysql está por defecto en InnoDB ahora donde solía ser MyISAM, por lo que este fue un comportamiento muy sorprendente. –

+0

También tuve este mismo problema. Sin embargo, en MySQL 5.5 el tipo de tabla predeterminado es InnoDB. Todo mi sitio se construyó con 5.1 (y acababa de actualizar a 5.5 antes de ejecutar syncdb y cargar datos en mi máquina). Por lo tanto, estaba recibiendo el mismo mensaje de error (# 1452). La solución fue cambiar el Tipo de BD a MyISAM en las opciones de la configuración antes de ejecutar sincronización db. Aquí está cómo: http://djangosaur.tumblr.com/post/357759467/django-transaction-mysql-engine-innodb –

Cuestiones relacionadas