2017-10-10 80 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工作。