创建表时Django MySQL错误

Den*_*nny 34 python mysql django

我正在使用MySQL DB构建一个django应用程序.当我第一次运行'python manage.py migrate'时,会创建一些表,然后会出现一些错误.带来的错误是:

django.db.utils.IntegrityError:(1215,'无法添加外键约束')

当我运行这个MySQL命令时 -

SHOW ENGINE INNODB状态\ G,

我明白了>>>

2015-02-17 14:33:17 7f10891cf700 Error in foreign key constraint of table movie_store/#sql-4f1_66:
 FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`):
Cannot resolve table name close to:
 (`id`)
Run Code Online (Sandbox Code Playgroud)

完整的追溯是:

Creating tables...
    Creating table users
    Creating table merchant
    Creating table celery_taskmeta
    Creating table celery_tasksetmeta
    Creating table djcelery_intervalschedule
    Creating table djcelery_crontabschedule
    Creating table djcelery_periodictasks
    Creating table djcelery_periodictask
    Creating table djcelery_workerstate
    Creating table djcelery_taskstate
    Creating table post_office_email
    Creating table post_office_log
    Creating table post_office_emailtemplate
    Creating table post_office_attachment
    Running deferred SQL...
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 330, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 390, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 441, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 173, in handle
    created_models = self.sync_apps(connection, executor.loader.unmigrated_apps)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 309, in sync_apps
    cursor.execute(statement)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 80, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 65, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 95, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/utils.py", line 63, in execute
    return self.cursor.execute(sql)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/mysql/base.py", line 124, in execute
    return self.cursor.execute(query, args)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 174, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')
Run Code Online (Sandbox Code Playgroud)

hie*_*nnt 33

这将有效

python manage.py migrate auth
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

由于其他迁移的问题在auth之前运行,因此这将确保"authtools"的迁移首先运行

  • 请考虑编辑您的帖子,以添加有关您的代码的功能以及解决问题的原因的更多说明.一个主要只包含代码的答案(即使它正在工作)通常不会帮助OP理解他们的问题. (4认同)

Rac*_*hel 9

您是否为所有应用创建了迁移?如果没有,您可能会遇到以错误的顺序创建数据库表的问题,这将给您带来此错误.

如果您有一个现有的Django 1.7项目,那么您需要创建初始迁移文件,然后伪造初始迁移,如此处所述

https://docs.djangoproject.com/en/1.8/topics/migrations/#adding-migrations-to-apps

使用创建迁移

$ python manage.py make migrations your_app_label
Run Code Online (Sandbox Code Playgroud)

然后伪造应用程序

$  python manage.py migrate --fake-initial your_app_label
Run Code Online (Sandbox Code Playgroud)

  • 看起来这不适用于单元测试 (2认同)

car*_*ing 7

我使用时遇到了这个问题:

$ python manage.py test
Run Code Online (Sandbox Code Playgroud)

如果您没有为其中有一个字段是这些模型使迁移外键django.contrib.auth.models.User,就会造成这个问题.

如果你启用了,--keepdb你会发现没有auth_user桌子和其他一些django的管理表.


让我们追踪整个问题:

跑:

$ python manage.py test --verbosity=3
Run Code Online (Sandbox Code Playgroud)

您可以看到之后引发的foreigngkey约束异常

运行延迟SQL ...

延迟的sql类似于

"ALTER TABLE xxxADD CONSTRAINT xxFOREIGN KEY(x)REFERENCES auth_user"

检查django/core/management/commands/migrate.py的源代码:

for statement in deferred_sql:
    cursor.execute(statement)
Run Code Online (Sandbox Code Playgroud)

defered_sql来自manifest.items()for循环,

manifest来自all_models,

all_models来自app_labels中的app_config.label.

这是通过的论点

self.sync_apps(connection, executor.loader.unmigrated_apps)
Run Code Online (Sandbox Code Playgroud)

因此,executor.loader.unmigrated_apps将包含unmigrated_app的标签,如果你发生了对Django的auth_user有一个Foreignkey,它会导致Foreignkey约束Error当时,没有名为auth_user的表.


解:

假设app是包含那些Foreignkey属性类的模块:

$ python manage.py migrate auth
$ python manage.py migrate
$ python manage.py makemigrations app
Run Code Online (Sandbox Code Playgroud)

并且,如果您有其他模块依赖于app,假设数据库表与app模块具有相同的字段,您需要:

$ python manage.py make migrate app --fake
Run Code Online (Sandbox Code Playgroud)


Jam*_*Lin -1

遇到了同样的问题,结果发现 Django 不知何故升级到了v1.8,然后立即降级为v1.7工作。