Django:如何将外键检查设置为 0

Posted

技术标签:

【中文标题】Django:如何将外键检查设置为 0【英文标题】:Django: How to set foreign key checks to 0 【发布时间】:2013-03-25 12:15:57 【问题描述】:

好的,我正在将数据库从 sqlite 迁移到 mysql,我几乎没有错误,但我已经解决了它们。现在我有这个选项的问题,因为我不知道如何禁用它。 我试过了

DATABASES = 

 'default': 
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'slave',                     
    'USER': 'root',                     
    'PASSWORD': 'root',                 
    'OPTIONS': 
                "init_command": "SET foreign_key_checks = 0;",
           ,
    'HOST': '',                    
    'PORT': '',                      
   

但它不起作用,我不知道为什么。

我使用 json 文件进行迁移

python manage.py dumpdata --indent 2 --natural > dump.json
python manage.py loaddata dump.json

当我开始加载数据时,我可以看到:

SET SQL_AUTO_IS_NULL = 0
SET foreign_key_checks=0

但过了一段时间:

SELECT (1) AS `a` FROM `xxx` WHERE `xxx`.`id` = 8  LIMIT 1
SET foreign_key_checks=1

然后我看到异常。 Traceback 并不重要,因为它与外键有关,您可以在此处阅读更多内容

http://coffeeonthekeyboard.com/django-fixtures-with-circular-foreign-keys-480/

我知道我需要禁用此选项。

我试过了:

http://djangosaur.tumblr.com/post/7842592399/django-loaddata-mysql-foreign-key-constraints

但就像我说的那样,它不起作用。

有人可以帮忙吗...

【问题讨论】:

如果导入重新启用 FK 检查,除了修改源文件以删除 FK 设置更改之外,您无能为力。 在哪里可以找到源文件? 【参考方案1】:

你可以把它放在settings.py的末尾:

import sys
if 'loaddata' in sys.argv:
    # only change this for loaddata command.
    DATABASES['default']['OPTIONS'] = 
       "init_command": "SET foreign_key_checks = 0;",
    

【讨论】:

我收到TypeError: 'init_command' is an invalid keyword argument for this function 如果您收到'init_command' is an invalid keyword 错误,您可以在您的字段中使用db_constraint=False 作为解决方法,请参阅此处:***.com/questions/8051556/… 看起来init_command 不受sqlite3 后端支持。后端显式设置PRAGMA foreign_keys = ON,参见source。另请参阅 SQLite docs。 似乎也不支持 postgres - 这个解决方案仅限于 mysql(我知道这是 OP 所要求的,但我和其他人一样,我确信来到这里是为了 otehr 后端......)

以上是关于Django:如何将外键检查设置为 0的主要内容,如果未能解决你的问题,请参考以下文章

实体 Remove() 将外键属性设置为 null

首次使用实体框架代码时将外键设置为 null

删除实体时休眠将外键设置为空

每当我尝试将外键约束设置为“NO ACTION”时,MySQL 工作台会自动将其设置为“RESTRICT”

Django如何将外键传递给ModelForm字段

Spring boot delete 没有级联,它将外键设置为 null,然后在 null 约束上失败