Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何(手动)在django迁移中删除并重新创建foreignkey约束_Python_Mysql_Django_Migration_Many To Many - Fatal编程技术网

Python 如何(手动)在django迁移中删除并重新创建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为此制作了一个很好的中间表

我想我有一个不太清楚的案子,Django没有涉及。 我使用的是Django 1.11.20,使用mySQL时会出现这个问题,而使用sqlite则没有问题(因为它不使用foreignkey约束)

这是设置。

  • 我有一个名为“Function”的模型,它有一个自动主键字段“id”(由Django制作)
  • 我有一个名为“Training”的模型,在这个模型上有一个叫做“subscribe\u functions”的很多关系,它指向函数

    课堂培训(注册块):

因此Django为此制作了一个很好的中间表,在该表上有一个外键约束,列'function_id'指向function.id

这就是问题所在。

现在我想在不丢失数据的情况下添加一个父模型,并实际将一些数据移动到父模型中。 因此,我创建父模型(“CoreFunction”)并对其进行迁移(在单独的应用程序中),然后在我的函数迁移中,我执行以下操作:

  • 将函数上的字段“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'),
    ),
    
本质上,将corefunction_ptr字段转换为primary_key字段,并将其指向父模型

在mySQL数据库上运行此迁移时,我得到一个错误,即存在foreignkey约束,并且无法修改corefunction_ptr字段

_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.')