簡體   English   中英

Django:如何將外鍵檢查設置為0

[英]Django: How to set foreign key checks to 0

好的,我正在將數據庫從 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': '',                      
   }
}

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

Ofc 我使用 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

然后我看到異常。 回溯並不重要,因為它與外鍵有關,您可以在此處閱讀更多內容

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

我知道我需要禁用此選項。

我試過:

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

但就像我說的那樣,這是行不通的。

有人可以幫忙嗎...

你可以把它放在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;",
    }

以防萬一,其他人需要這個用於 sqlite3,將以下代碼添加到您的 settings.py:

if 'loaddata' in sys.argv:

    # is database used sqlite3?
    if 'sqlite3' in DATABASES['default']['ENGINE']:
    # disable sqlite foreign key checks
        print("Loading data from fixtures - disabling foreign key checks")
        from django.db.backends.signals import connection_created
        def disable_foreign_keys(sender, connection, **kwargs):
            cursor = connection.cursor()
            cursor.execute('PRAGMA foreign_keys=OFF;')
        connection_created.connect(disable_foreign_keys)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM