【问题标题】:django.db.utils.OperationalError: 1005, 'Can't create table `xyz`.`#sql-600_237` (errno: 150 "Foreign key constraint is incorrectly formed")django.db.utils.OperationalError: 1005, 'Can't create table `xyz`.`#sql-600_237` (errno: 150 "外键约束格式不正确")
【发布时间】:2017-03-18 16:44:15
【问题描述】:

我正在尝试将一对一密钥添加到我的 Django 应用程序中,但是当我尝试“迁移”过程时总是会收到该错误(makemigrations 效果很好)。

  Applying xyzapp.0007_personne_extended_foreign...Traceback (most recent call last):
  File "manage.py", line 29, in <module>
    execute_from_command_line(sys.argv)
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
utility.execute()
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 346, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 222, in handle
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 110, in migrate
    self.apply_migration(states[migration], migration, fake=fake, fake_initial=fake_initial)
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 148, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 91, in __exit__
    self.execute(sql)
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 111, in execute
    cursor.execute(sql, params)
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/db/utils.py", line 98, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/opt/xyz/env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
    return self.cursor.execute(sql, params)
  File "/opt/xyz/env/local/lib/python2.7/site-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 226, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorvalue
django.db.utils.OperationalError: (1005, 'Can\'t create table `xyz`.`#sql-600_297` (errno: 150 "Foreign key constraint is incorrectly formed")')

这就是我的模型的样子:

class PersonVolunteer(models.Model):
    person = models.OneToOneField(Person)

class Person(models.Model):
    name = models.CharField(max_length=100)

以及导致崩溃的迁移过程:

类迁移(migrations.Migration):

dependencies = [
    ('xyzapp', '0014_member_to_person'),
]

operations = [
    migrations.CreateModel(
        name='PersonVolunteer',
        fields=[
            ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
            ('personne', models.OneToOneField(to='xyzapp.Personne')),
        ],
    ),
]

但是,即使在迁移错误之后,当我对其进行测试时,一切正常。但是,如果在“迁移”期间出现该错误消息,那应该不是好事。如果没有问题,是否可以跳过导致迁移崩溃的最后一步?

谁能告诉我为什么会收到该错误消息以及如何解决它?

非常感谢您,祝您有美好的一天!

【问题讨论】:

  • 请显示失败的migrate 命令的完整输出。您是否创建了迁移以创建 cvmapp.Personne 并运行它?当您使用像 xyzapp 这样的虚构名称时,您的问题会更加令人困惑。
  • 我现在已经把所有的错误回溯了
  • 你确定是“personne”而不是“person”吗?您在模型中使用了“person”,但在迁移中使用了“personne”。
  • 我认为您没有显示正确的迁移。该错误表明在应用xyzapp.0007_personne_extended_foreign时发生错误,但是您显示的迁移依赖于稍后的迁移('xyzapp', '0014_member_to_person'),

标签: python django django-migrations


【解决方案1】:

我找到了一个解决方案,可能不是更清洁,但该死的它有效,这对我来说是完美的。

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models

class Migration(migrations.Migration):

    dependencies = [
        ('cvmapp', '0006_person_extended'),
    ]

    operations = [
        migrations.AddField(
            model_name='PersonVolunteer',
            name='personne',
            field=models.OneToOneField(related_name='info_volunteer', to='cvmapp.Person', db_constraint=False),
        ),
    ]

诀窍是添加“db_constraint=False”作为 OneToOne 字段的参数。

【讨论】:

  • 第三方应用如何解决?
【解决方案2】:

请确保您的所有 MySQL 表都使用相同的存储引擎(即 MyISM v. InnoDB)。尤其是它们之间有外键的表。

如果您需要有关 MySQL 存储引擎以及如何知道您正在使用哪些存储引擎的更多信息,您将需要阅读 MySQL 文档,尽管我们的数据库文档中的 MySQL 说明也有一些介绍性信息。

我怀疑您使用 MyISAM 存储引擎创建了表(MySQL

您可以从 phpMyadmin 更改表存储引擎。单击您的名称,转到“操作”选项卡,然后在“表操作”框中进行更改。将所有或您的存储引擎转换为相同的。

【讨论】:

    【解决方案3】:

    在 MySql 或 MariaDB 控制台客户端(mariadb linkmysql link)中查看命令 SHOW ENGINE INNODB STATUS 的输出。它比错误消息提供更多信息。 例如,它向我显示了这条消息:

    ...
    ------------------------
    LATEST FOREIGN KEY ERROR
    ------------------------
    2021-09-20 18:27:08 7faea3ad1700 Error in foreign key constraint of table `my_db`.`django_admin_log`:
    Alter  table `my_db`.`django_admin_log` with foreign key constraint failed. Referenced table `my_db`.`profiles_userprofile` not found in the data dictionary near ' FOREIGN KEY (`user_id`) REFERENCES `profiles_userprofile` (`id`)'.
    ...
    

    它告诉我我忘了创建迁移。

    【讨论】:

      猜你喜欢
      • 2020-03-23
      • 2018-06-19
      • 2018-03-02
      • 2020-07-07
      • 1970-01-01
      • 2017-04-13
      • 2018-09-04
      • 2019-09-17
      • 2020-12-16
      相关资源
      最近更新 更多