【发布时间】:2011-11-12 14:13:10
【问题描述】:
我在我的 Django 应用中使用 South。我有两个模型,我正在从 ForeignKey 关系更改为 OneToOneField 关系。当我在我的开发数据库上运行此迁移时,它运行良好。当迁移作为创建测试数据库的一部分运行时,最新的迁移失败并出现 MySQL 1005 错误:“无法创建表 mydb.#sql-3249_1d (errno: 121)”。做一些谷歌搜索表明,这通常是尝试添加与现有约束同名的约束时出现的问题。迁移失败的具体行是:
关系更改自:
class MyModel(models.Model):
othermodel = models.ForeignKey(OtherModel)
到
class MyModel(models.Model):
othermodel = models.OneToOneField(OtherModel)
在迁移中生成了以下语句:
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'])
但不是在create_unique 调用上失败,而是在alter_column 调用上失败。我运行了以下命令来查看正在生成什么 SQL:
python manage.py migrate myapp 0010 --db-dry-run --verbosity=2
打印出来了
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`) []
它尝试运行ADD CONSTRAINT 两次似乎很奇怪,但是如果我删除db.create_unique 调用,当我使用--db-dry-run 运行它时不会生成SQL,但如果我运行我仍然会收到错误真的。
我在这里不知所措,感谢任何帮助。
【问题讨论】:
-
几天前我创建了完全相同的迁移,并且运行良好。你能用不同的数据库后端尝试相同的代码吗(我是在 PostgreSQL 数据库上做的)。另外,请检查您的 South 版本。
-
希望我能提供帮助 - 我进行了更改,它生成了相同的 python 和 SQL 代码,并且迁移运行良好,使用 mysql 5.1.56 for win32。
-
在 South 邮件列表中提出这个问题,您很可能会找到答案。
标签: python mysql django django-south