创建表时Django MySQL错误

时间:2015-02-17 12:26:04

标签: python mysql django

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

  

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

当我运行这个MySQL命令时 -

  

SHOW ENGINE INNODB STATUS \ 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`)

完整的追溯是:

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')

11 个答案:

答案 0 :(得分:32)

这将有效

python manage.py migrate auth
python manage.py migrate

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

答案 1 :(得分: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

然后伪造应用程序

$  python manage.py migrate --fake-initial your_app_label

答案 2 :(得分:7)

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

$ python manage.py test

如果您没有为那些具有外键字段的模型进行迁移到 django.contrib.auth.models.User ,则会导致问题。

如果你启用--keepdb,你会发现没有auth_user表和其他django的管理表。

让我们追踪整个问题:

运行:

$ python manage.py test --verbosity=3

您可以在

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

运行延迟SQL ...

延迟sql类似于

  

“ALTER TABLE xxx ADD CONSTRAINT xx FOREIGN KEY(x)参考auth_user

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

for statement in deferred_sql:
    cursor.execute(statement)

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

manifest来自all_models

all_models来自 app_labels 中的app_config.label。

这是

传递的参数
self.sync_apps(connection, executor.loader.unmigrated_apps)

因此,executor.loader.unmigrated_apps将包含unmigrated_app的标签,如果你发现有一个外键到Django的auth_user,它将导致Forekey约束错误原因,当时没有名为auth_user的表。

溶液:

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

$ python manage.py migrate auth
$ python manage.py migrate
$ python manage.py makemigrations app

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

$ python manage.py make migrate app --fake

答案 3 :(得分:4)

我对外键问题有同样的问题&#39; author_id&#39;。

解决方案是从

更改名称
author = models.ForeignKey(User, related_name='+')

writer = models.ForeignKey(User, related_name='+')

因此,请尝试将字段名称更改为与

不同的名称
group

答案 4 :(得分:2)

尝试在BitBucket / Pipelines中设置CI时遇到了同样的错误。问题是我没有将迁移文件夹提交到我们的git存储库中,因为Pipelines每次都从头开始重建所有内容,单元测试无法启动。

执行时会创建迁移文件夹:

python manage.py makemigrations
python manage.py makemigrations <module_name>

运行makemigrations / migrate步骤并确保我们的非测试代码正常工作后,我的测试会起作用。

似乎:

python manage.py test 

将尝试生成迁移,如果它们当前不存在,但它无法始终正确获取依赖项,因此您需要确保在迁移文件夹中提交自动生成的代码到你的源代码库。

有关django迁移的更多详细信息,请访问:https://docs.djangoproject.com/en/1.11/topics/migrations/

答案 5 :(得分:1)

确保外键和主键的类型相同。

外键必须与外表的主键类型相同。我在外表中有一个bigint,django不知道如何自动创建一个bigint的外键。

通过运行调查迁移失败的原因: python manage.py sqlmigrate {app_name} {migration_name}

在工作台中运行它,您将看到失败背后的真正错误。

django.db.utils.IntegrityError:(1215,&#39;无法添加外键约束&#39;)

答案 6 :(得分:0)

在针对MySQL数据库的Django库上运行测试时,我遇到了类似的问题(以避免Django 2.2 incompatibilities with CentOS 7)。这类似于问题carton.swing's answer解决的问题,但是采用了不同的方法来解决问题。

关于我正在测试的库的一些注释:

  • 未定义任何模型,但 测试套件定义了用于测试目的的模型
  • 测试套件依赖于未定义模型的外键,特别是auth.User模型。

调查了old Django ticket后,我注意到了以下答复:

您的问题是未迁移的应用程序(身份验证令牌)依赖(具有FK)已迁移的应用程序(主)。这是众所周知的禁忌。

(我找不到其他引用,这是“众所周知的禁止”。)由于测试套件定义了一些模型,并且还使用了Django提供的auth.User,所以我猜想测试运行程序(在这种情况下为pytest)迁移了测试套件中定义的模型,但没有迁移auth.User。为了对此进行测试,我关闭了我的测试套件上的迁移(对于pytest-django,只需添加一个--no-migrations flag),即可解决此问题。

答案 7 :(得分:0)

遇到类似情况,

lr_coefficients = lr_model.coefficients lr_coefficients.append(lr_coefficients) lr_coefficients [DenseVector([-0.0009, -0.2476, 0.5486, 0.396]), DenseVector([-0.0016, -1.5333, 0.4269, 0.4363]), DenseVector([-0.0492, 0.0, 0.2077, 0.7548]), DenseVector([-0.001, -1.2098, 0.545, 0.4148]), DenseVector([-0.0001, 0.0, 0.575, 0.3638]), DenseVector([-0.001, -1.3361, 0.5402, 0.4113]), DenseVector([-0.0049, -1.5534, 0.5747, 0.3934]), DenseVector([-0.0049, -1.5534, 0.5747, 0.3934]), DenseVector([-0.0049, -1.5534, 0.5747, 0.3934]), DenseVector([-0.0049, -1.5534, 0.5747, 0.3934]), DenseVector([-0.0049, -1.5534, 0.5747, 0.3934]), DenseVector([-0.0049, -1.5534, 0.5747, 0.3934])]

首先,通过确保已正确完成所有迁移来解决此问题,每个应用程序都具有其相应的迁移文件夹以及其中的django.db.utils.OperationalError: (1824, "Failed to open the referenced table 'auth_user'")文件。

此后,我在数据库中的另一个表上遇到了类似的问题,该问题引发了另一个错误,这使我无法开始测试。 我通过删除django_migrations表中的所有记录并删除所有迁移文件(如果可以的话)解决了该问题。然后我跑

__init__.py

python manage.py makemigrations

所有与废话有关的问题:)

答案 8 :(得分:-1)

出现同样的问题,结果是Django升级到v1.8,并迅速降级为v1.7

答案 9 :(得分:-3)

在Django 1.8中删除了syncdb命令,而不是syncdb尝试manage.py migrate命令然后表格将创建。之后你必须创建超级用户使用超级用户创建命令或运行manage.py syncdb,它将工作。

答案 10 :(得分:-3)

如果上述方法不起作用并且您不需要Innodb,则默认为MYISAM工作,因为它没有相同的参照完整性级别:

DATABASES = { 
  'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'name',                      
    'USER': 'user',     
    'PASSWORD': 'password',
    'OPTIONS': {
           "init_command": "SET storage_engine=MYISAM",
    }   
  }   
}