Estoy usando South con mi aplicación Django. Tengo dos modelos que estoy cambiando de tener una relación ForeignKey
a tener una relación OneToOneField
. Cuando ejecuté esta migración en mi base de datos de desarrollo, funcionó bien. Cuando las migraciones se ejecutan como parte de la creación de una base de datos de prueba, la última migración falla con un error MySQL 1005: "No se puede crear la tabla mydb. # Sql-3249_1d (errno: 121)". Al hacer algunas búsquedas en Google, se reveló que esto suele ser un problema al tratar de agregar una restricción con el mismo nombre que una restricción existente. La línea específica en la migración que se produce un error en es:Django - Cambiar una relación ForeignKey con OneToOne
La relación fue cambiado de:
class MyModel(models.Model):
othermodel = models.ForeignKey(OtherModel)
a
class MyModel(models.Model):
othermodel = models.OneToOneField(OtherModel)
que generó las siguientes declaraciones en la migración:
db.alter_column('myapp_mymodel', 'othermodel_id', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['myapp.OtherModel'], unique=True))
db.create_unique('myapp_mymodel', ['othermodel_id'])
Pero en lugar de fallar en la llamada create_unique
, está fallando en el alter_column
llamada. Me encontré con el siguiente comando para ver qué SQL se está generando:
python manage.py migrate myapp 0010 --db-dry-run --verbosity=2
y se imprimieron
myapp:0010_auto__chg_field_mymodel_othermodel__add_unique_mymodel
= ALTER TABLE `myapp_mymodel` ADD CONSTRAINT `myapp_mymodel_othermodel_id_uniq` UNIQUE (`othermodel_id`) []
= SET FOREIGN_KEY_CHECKS=1; []
= ALTER TABLE `myapp_mymodel` ADD CONSTRAINT `myapp_mymodel_othermodel_id_uniq` UNIQUE (`othermodel_id`) []
Parece extraño que se trata de abrir el ADD CONSTRAINT
dos veces, pero si quito el db.create_unique
llamada, no se genera SQL cuando lo ejecuto con --db-dry-run
, pero aún obtengo el error si lo ejecuto de manera real.
Estoy perdido, cualquier ayuda es apreciada.
He creado exactamente la misma migración hace unos días y que funcionó muy bien. ¿Podría probar el mismo código con un backend de base de datos diferente (lo hice en una base de datos PostgreSQL). Además, verifique su versión Sur. – emyller
Ojalá pudiera ayudar, hice el cambio, generó el mismo código python y SQL, y la migración funcionó perfectamente, usando mysql 5.1.56 para win32. – Hannele
Pregunta esto en la lista de correo del Sur y es muy probable que encuentres la respuesta. –