Python 如何(手动)在django迁移中删除并重新创建foreignkey约束
我想我有一个不太清楚的案子,Django没有涉及。 我使用的是Django 1.11.20,使用mySQL时会出现这个问题,而使用sqlite则没有问题(因为它不使用foreignkey约束) 这是设置。Python 如何(手动)在django迁移中删除并重新创建foreignkey约束,python,mysql,django,migration,many-to-many,Python,Mysql,Django,Migration,Many To Many,我想我有一个不太清楚的案子,Django没有涉及。 我使用的是Django 1.11.20,使用mySQL时会出现这个问题,而使用sqlite则没有问题(因为它不使用foreignkey约束) 这是设置。 我有一个名为“Function”的模型,它有一个自动主键字段“id”(由Django制作) 我有一个名为“Training”的模型,在这个模型上有一个叫做“subscribe\u functions”的很多关系,它指向函数 课堂培训(注册块): 因此Django为此制作了一个很好的中间表
- 我有一个名为“Function”的模型,它有一个自动主键字段“id”(由Django制作)
- 我有一个名为“Training”的模型,在这个模型上有一个叫做“subscribe\u functions”的很多关系,它指向函数
课堂培训(注册块):
- 将函数上的字段“id”重命名为“corefunction\u ptr”
migrations.RenameField( model_name='function', old_name='id', new_name='corefunction_ptr' ),
- 通过
操作将一些数据从子模型传输到父模型RunPython
- 然后这样做:
migrations.AlterField( model_name='function', name='corefunction_ptr', field=models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='rlgcore.CoreFunction'), ),
_mysql_exceptions.OperationalError: (1846, 'ALGORITHM=COPY is not supported. Reason: Columns participating in a foreign key are renamed. Try ALGORITHM=INPLACE.')
通过我的数据库,我发现这是对中间表函数的约束
我将它精确定位到这个查询(在phpmyadmin中抛出它时,它会给出相同的错误)。
ALTER表'pe_function'更改'coreffunction_ptr''coreffunction_ptr_id'整数不为空代码>
然而,有另一个模型通过ForeignKey链接到函数,对于该表,约束被删除,稍后将重新创建。(我运行了python manage.py sqlmigrate[appname][migrationname
]来查看发生了什么)
I如果决定是否应取消外国钥匙限制,但由于决定为反向限制,许多情况下,该决定会导致错误
所以问题是
如何在迁移文件中编写代码,检查我试图重命名id字段的模型是否有更多约束,然后删除约束,然后再次添加
我已通过原始SQL查询找到。然而,我必须将所有找到的信息存储在某个地方(全局变量?),以便以后能够再次添加相同的约束。我更愿意使用Django代码本身(例如来自),但我不知道如何使用
我知道可以提供给RunPython
操作的函数会得到一个模式编辑器,但我不知道如何/从哪里获得以及如何传递参数\u delete\u constraint\u sql
和\u create\u fk\u sql
expect
我想用尽可能少的字段/表名/模型名等硬编码来解决这个问题
有什么想法吗
_mysql_exceptions.OperationalError: (1846, 'ALGORITHM=COPY is not supported. Reason: Columns participating in a foreign key are renamed. Try ALGORITHM=INPLACE.')