当前位置: 首页 > 知识库问答 >
问题:

Django执行makemigrations操作时出现“无法添加外键约束”错误

左丘昊天
2023-03-14

我用的是Django 1.9.5和python 2.7。我也在用MySQL做数据库。当我尝试进行迁移时,我得到了以下错误

"无法添加外键约束"

当我尝试将许多字段添加到现有表中时,我收到此错误。当我进行迁移和迁移时,会创建多对多关系表,但没有外键约束。

在运行服务器时,它还表示:;

"您有未应用的迁移;在应用它们之前,您的应用可能无法正常工作。"

运行pythonmanage.py迁移来应用它们。我可以通过网站向这个表添加新数据,但是没有外键约束。但是我需要为关系创建带有外键约束的表字段。该操作将在Worker和Worker的表之间创建多对多的关系。MySQL是InnoDB配置的。

错误日志:

        # python manage.py migrate
    Operations to perform:
      Apply all migrations: authtoken, sessions, admin, auth, reversion, contenttypes, company
    Running migrations:
      Rendering model states... DONE
      Applying company.0005_Worker_duty_type...Traceback (most recent call last):
      File "manage.py", line 10, in <module>
        execute_from_command_line(sys.argv)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
        utility.execute()
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/core/management/__init__.py", line 345, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/core/management/base.py", line 348, in run_from_argv
        self.execute(*args, **cmd_options)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/core/management/base.py", line 399, in execute
        output = self.handle(*args, **options)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 200, in handle
        executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/db/migrations/executor.py", line 92, in migrate
        self._migrate_all_forwards(plan, full_plan, fake=fake, fake_initial=fake_initial)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/db/migrations/executor.py", line 121, in _migrate_all_forwards
        state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/db/migrations/executor.py", line 198, in apply_migration
        state = migration.apply(state, schema_editor)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 90, in __exit__
        self.execute(sql)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 110, in execute
        cursor.execute(sql, params)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
        return super(CursorDebugWrapper, self).execute(sql, params)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
        return self.cursor.execute(sql, params)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/db/utils.py", line 95, in __exit__
        six.reraise(dj_exc_type, dj_exc_value, traceback)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
        return self.cursor.execute(sql, params)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 112, in execute
        return self.cursor.execute(query, args)
      File "/home/dataproj/Env/dataproj/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
        self.errorhandler(self, exc, value)
      File "/home/dataproj/Env/dataproj/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')

代码如下:

models.py :


class Workerduty(BaseModel):

    name = models.CharField(max_length=50, unique=True, verbose_name=_("Worker Duty"))

    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ['name']

class Worker(BaseModel):

    duty_type = models.ManyToManyField(Workerduty, verbose_name=_("Worker Duty"))
    name = models.CharField(max_length=100, db_index=True, verbose_name=_("Name"))

    class Meta:
        permissions = (
            ("Workerl", _("Workerl")),
        )
        ordering = ['name']

    def __unicode__(self):
        return "%s %s" % (self.name)

    def save(self, *args, **kwargs):
        self.name = self.name.title()
        grps = []
        for Workerduty_obj in self.Workerduty.all():
            grp = Group.objects.get_or_create(name=Workerduty_obj.name)[0]
            grps.append(grp)
        self.user.grps = grps
        self.user.save()
        super(Worker, self).save(*args, **kwargs)

迁移文件 :

    # -*- coding: utf-8 -*-
# Generated by Django 1.9.5 on 2018-06-28 20:09
from __future__ import unicode_literals

from django.db import migrations, models
import uuid


class Migration(migrations.Migration):

    dependencies = [
        ('company', '0001_initial'),
    ]

    operations = [
        migrations.CreateModel(
            name='Workerduty',
            fields=[
                ('uuid', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False, verbose_name='Unique Identifier')),
                ('name', models.CharField(max_length=50, unique=True, verbose_name='Worker Duty')),
            ],
            options={
                'ordering': ['name'],
            },
        ),
        migrations.AddField(
            model_name='worker',
            name='worker_type',
            field=models.ManyToManyField(to='college.Workerduty', verbose_name='Worker Duty'),
        ),
    ]

共有1个答案

黄宏旷
2023-03-14

解决方案:我正在处理一个现有的项目。MySQL数据库是UTF8排序的。我用新的MySQL准备了一个测试环境,并克隆了数据库。但是默认的mysql排序规则是latin1,而导入的DB是UTF8。所以旧表和django新创建的表之间存在冲突。所以我将新的mysql安装的排序规则更改为utf8。所以新创建的表现在使用新的默认utf8排序规则创建,这与导入的DB相同。

我在mysql控制台上使用了以下命令:

SELECT DISTINCT concat('ALTER DATABASE `', TABLE_SCHEMA, '` CHARACTER SET utf8 COLLATE utf8_general_ci;') from information_schema.tables where TABLE_SCHEMA like  'DbName';
 类似资料:
  • 我有两张桌子。第一个是人口;第二个是空的。 我希望第二个有一个外键,它引用第一个中的一列。 null 架构: 填充。为空。 不能成为的外键: MySQL没有提供错误的原因;不返回: 我拥有所需的数据库权限。 我已经仔细检查了列(甚至表)是否具有相同的排序规则(字符集不适用于INT列): MySQL无法添加外键约束 MySQL:错误1215(HY000):无法添加外键约束 无法添加外键约束-MySQ

  • 我想添加两个表,一个产品表和一个类别表。然后我要将产品表中的一个类别id链接到类别表中的主键。下面是我的代码: SQLSTATE[HY000]:一般错误:1215无法添加外键约束(SQL:alter table添加约束外键()引用())

  • 问题内容: 因此,我作为项目需求试图将外键约束添加到数据库中,并且它第一次或在两个不同的表上运行,但是在尝试添加外键约束时,我在两个表上遇到错误。我收到的错误消息是: 错误1215(HY000):无法添加外键约束 这是我用来创建表的SQL,两个有问题的表是和。 问题答案: 要查找特定错误,请运行以下命令: 并查看该部分。 子列的数据类型必须与父列完全匹配。例如,由于是,也需要是,而不是。 另外,您

  • 问题内容: 我正在尝试将新模式转发工程到我的数据库服务器上,但是我不知道为什么会收到此错误。我试图在这里搜索答案,但是我发现的所有内容都说是将db引擎设置为Innodb或确保要用作外键的键是它们自己表中的主键。如果我没记错的话,我都做过这两件事。你们还有其他帮助吗? SQL脚本执行完成:语句:成功7次​​,失败1次 这是父表的SQL。 问题答案: 我猜,和/或不完全相同的数据类型和。 也许父表中的

  • 引用的表是“组”(InnoDB)。 它有一个“id”列,定义为INT(11),不可为空,自动递增,主键 引用表为“用户(InnoDB)” 它的group_id列定义为INT(11),不可为空。 在引用表中已经存在一个基于“group_id”列的唯一索引 但是whn正在执行 我出错了 错误:1215无法添加外键约束 我添加db转储 检查清单 Db是InnoDB吗?是的 所有表都是InnoDB吗?是的

  • 问题内容: 我正在尝试通过使用外键来确保表之间的数据一致性,以便DBMS可以检查错误。但是,由于某些原因,我们似乎无法做到这一点。有什么错误,还有替代方法吗?另外,当我填写具有外键的表时,无法填写为外键保留的字段,对吗?另外,外键是否完全视为键? 问题答案: 最可能的问题是此行: classLeader的数据类型为VARCHAR(255)。这有 匹配数据类型 的引用的列… 。当然,表必须存在,列也