2017-10-10 43 views
0

產生遷移在空白的MySQL數據庫,我產生遷移的一個Django 1.11項目有:無法在Django 1.11

python manage.py makemigrations 

我有幾個自定義相互依存的應用程序,但沒有錯誤產生的所有的遷移。然而,當我試圖與應用這些遷移:

python manage.py migrate 

它適用於大多數應用程序遷移就好了,但也有一些自定義的FeinCMS與遷移:

Applying page.0001_initial...Traceback (most recent call last): 
    File "manage.py", line 9, in <module> 
    execute_from_command_line(sys.argv) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line 
    utility.execute() 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 356, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/base.py", line 283, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/base.py", line 330, in execute 
    output = self.handle(*args, **options) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 204, in handle 
    fake_initial=fake_initial, 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 115, in migrate 
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 145, in _migrate_all_forwards 
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 244, in apply_migration 
    state = migration.apply(state, schema_editor) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 93, in __exit__ 
    self.execute(sql) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 120, in execute 
    cursor.execute(sql, params) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 101, in execute 
    return self.cursor.execute(query, args) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute 
    self.errorhandler(self, exc, value) 
    File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint') 

不幸的是,它沒有說,外國鍵沒有生成,並且遷移有幾個。我試着對遷移過程中的每個字段進行評論,重新運行它,但是當我這樣做時遷移成功。

爲什麼此遷移失敗,我該如何解決?

回答

0

你在Django創建的表中有一個問題,表中沒有INNODB ENGINE

在MySQL如果表中有INNODB ENGINE,可以使關係作爲外交重點,否則在問題

"django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')" 

提到我對這個問題的解決方案Django將返回錯誤。 首先創建新的管理命令文件,如姓名「convert_to_innodb」

,並在管理命令文件中的終端

python manage.py convert_to_innodb 

如下代碼添加

from django.core.management.base import BaseCommand 
from django.db import connections 


class Command(BaseCommand): 
    def handle(self, database="default", *args, **options): 
     cursor = connections[database].cursor() 
     cursor.execute("SHOW TABLE STATUS") 
     for row in cursor.fetchall(): 
      if row[1] != "InnoDB": 
       print "Converting %s" % row[0], 
       print cursor.execute("ALTER TABLE %s ENGINE=INNODB" % row[0]) 

和運行命令該命令執行後,您可以在已經創建的表中創建外鍵但是

'OPTIONS': { 
    'init_command': 'SET default_storage_engine=INNODB', 
} 

數據庫設置中添加該配置如下圖所示

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'DB_NAME', 
     'USER': 'DB_USER', 
     'PASSWORD': 'DB_PASSWORD', 
     'HOST': 'localhost', # Or an IP Address that your DB is hosted on 
     'PORT': '3306', 
     'OPTIONS': { 
      'init_command': 'SET default_storage_engine=INNODB', 
     } 
    } 
} 

這DB配置將創造下一次INNODB ENGINE表,會爲今後的工作中沒有錯誤

+0

感謝您的這篇文章,但我不認爲這是問題。我的數據庫已經是InnoDB。 – Cerin

0

因爲一個糟糕的合併,有在以前的遷移一些錯誤,導致舊版遷移和我的模型中的列之間斷開連接。我解決了這個問題的:

  1. 刪除我的所有遷移
  2. 截斷我django_migrations
  3. 運行manage.py makemigrations

然後migrate工作。