我正在使用South和我的Django应用程序。我有两个模型,我从ForeignKey
关系变为OneToOneField
关系。当我在我的开发数据库上运行这个迁移时,它运行良好。当迁移作为创建测试数据库的一部分运行时,最新的迁移失败并出现MySQL 1005错误:“无法创建表mydb。#sql-3249_1d(errno:121)”。做一些谷歌搜索显示,这通常是一个问题,试图添加与现有约束相同的名称的约束。在迁移它未能对特定行是:Django - 将OneKey关系更改为OneToOne
的关系变为从:
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
呼叫失败,它是失败的01致电。我跑到下面的命令来查看正在发生什么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数据库中做过)。 另外,请检查您的南方版本。 – emyller
希望我能帮忙 - 我做了改变,它生成了相同的python和SQL代码,并且迁移运行得很好,使用mysql 5.1.56 for win32。 – Hannele
在South邮件列表上询问这个问题,你很可能找到答案。 –