17 python mysql django django-south
我正在使用我的Django应用程序.我有两个模型,我正在改变与ForeignKey关系的OneToOneField关系.当我在我的dev数据库上运行此迁移时,它运行正常.当迁移作为创建测试数据库的一部分运行时,最新的迁移失败,出现MySQL 1005错误:"无法创建表mydb.#sql-3249_1d(错误号:121)".做一些谷歌搜索显示,这通常是尝试添加与现有约束具有相同名称的约束的问题.它失败的迁移中的特定行是:
关系改变自:
class MyModel(models.Model):
othermodel = models.ForeignKey(OtherModel)
Run Code Online (Sandbox Code Playgroud)
至
class MyModel(models.Model):
othermodel = models.OneToOneField(OtherModel)
Run Code Online (Sandbox Code Playgroud)
在迁移中生成以下语句:
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'])
Run Code Online (Sandbox Code Playgroud)
但是create_unique,它没有在alter_column通话中失败,而是在通话失败.我运行以下命令来查看正在生成的SQL:
python manage.py migrate myapp 0010 --db-dry-run --verbosity=2
Run Code Online (Sandbox Code Playgroud)
它打印出来了
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`) []
Run Code Online (Sandbox Code Playgroud)
它试图运行ADD CONSTRAINT两次似乎很奇怪,但是如果我删除了db.create_unique调用,当我运行它时没有生成SQL ,但是如果我真的运行它--db-dry-run仍然会得到错误.
我在这里不知所措,任何帮助表示赞赏.
e-s*_*tis 11
实际上你根本不需要迁移.OneToOne和ForeignKey关系在钩子下具有兼容的数据库模式:一个简单的列,其中一个表中包含另一个对象ID.
migrate --fake如果您不想进入告诉南方忽略此更改的麻烦,请假装迁移.
我要尝试的第一件事是db.delete_unique(...)在不同的地方添加 a ,看看我是否可以破解它。
如果做不到这一点,我会将其分为 3 个迁移: