Django:在mysql中迁移表时无法添加外键约束

时间:2017-11-27 10:17:24

标签: python mysql django migration

我有很多桌子,并尝试进行迁移,这将Charfield变成了许多领域。但是,当我这样做时,我遇到了这个错误。我想要做的是改变已经有数据的表中的列,并创建两个与新列相关的新表。我不知道如何解决这个问题。

错误日志就是这个。

    Operations to perform:
  Apply all migrations: food
Running pre-migrate handlers for application food 
Running pre-migrate handlers for application admin_tools
Running pre-migrate handlers for application theming
Running pre-migrate handlers for application menu
Running pre-migrate handlers for application dashboard
Running pre-migrate handlers for application admin
Running pre-migrate handlers for application auth
Running pre-migrate handlers for application contenttypes
Running pre-migrate handlers for application sessions
Running pre-migrate handlers for application rest_framework
Running migrations:
Applying fiid.0113_auto_20171127_1852...Traceback (most recent call last):
File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute
 return self.cursor.execute(sql, params)
File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/db/backends/mysql/base.py", line 101, in execute
return self.cursor.execute(query, args)
File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/MySQLdb/cursors.py", line 250, in execute
self.errorhandler(self, exc, value)
File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
raise errorvalue
File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/MySQLdb/cursors.py", line 247, in execute
res = self._query(query)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/MySQLdb/cursors.py", line 411, in _query
rowcount = self._do_query(q)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/MySQLdb/cursors.py", line 374, in _do_query
db.query(q)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/MySQLdb/connections.py", line 292, in query
 _mysql.connection.query(self, query)
_mysql_exceptions.IntegrityError: (1215, 'Cannot add foreign key constraint')

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 363, in execute_from_command_line
utility.execute()
File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 355, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/core/management/base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 204, in handle
fake_initial=fake_initial,
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/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 "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/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 "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/db/migrations/executor.py", line 244, in apply_migration
state = migration.apply(state, schema_editor)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 93, in __exit__
self.execute(sql)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/db/backends/base/schema.py", line 120, in execute
cursor.execute(sql, params)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/db/backends/utils.py", line 80, in execute
return super(CursorDebugWrapper, self).execute(sql, params)
  File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/utils/six.py", line 685, in reraise
raise value.with_traceback(tb)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/django/db/backends/mysql/base.py", line 101, in execute
return self.cursor.execute(query, args)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/MySQLdb/cursors.py", line 250, in execute
self.errorhandler(self, exc, value)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/MySQLdb/connections.py", line 50, in defaulterrorhandler
raise errorvalue
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/MySQLdb/cursors.py", line 247, in execute
res = self._query(query)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/MySQLdb/cursors.py", line 411, in _query
rowcount = self._do_query(q)
 File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/MySQLdb/cursors.py", line 374, in _do_query
db.query(q)
  File "/home/i-06/PycharmProjects/food-front-service/.venv/lib/python3.5/site-packages/MySQLdb/connections.py", line 292, in query
_mysql.connection.query(self, query)

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

我在考虑删除所有数据并进行迁移,但由于此应用程序已投入使用,因此无法实现。这是我的迁移文件。

# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-11-27 18:52
from __future__ import unicode_literals

from django.db import migrations, models

import uuid

class Migration(migrations.Migration):

    dependencies = [
        ('food', '0112_auto_20171127_1604'),
    ]

    operations = [
    migrations.CreateModel(
        name='FacilityCategory',
        fields=[
            ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
            ('name', models.CharField(max_length=20, verbose_name='facility category')),
        ],
        options={
            'verbose_name': 'facility category',
            'verbose_name_plural': 'facility category',
        },
    ),
    migrations.CreateModel(
        name='MiscellaneousCategory',
        fields=[
            ('id', models.UUIDField(default=uuid.uuid4, primary_key=True, serialize=False)),
            ('name', models.CharField(max_length=20, verbose_name='misc category')),
        ],
        options={
            'verbose_name': 'misc category',
            'verbose_name_plural': 'misc category',
        },
    ),
    migrations.RemoveField(
        model_name='product',
        name='facility',
    ),
    migrations.AlterField(
        model_name='product',
        name='free_parking',
        field=models.CharField(blank=True, choices=[('0', '0'), ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8'), ('9', '9'), ('10', '10'), ('11', '11'), ('12', '12'), ('13', '13'), ('14', '14'), ('15', '15'), ('16', '16'), ('17', '17'), ('18', '18'), ('19', '19'), ('20', '20'), ('21', '21'), ('22', '22'), ('23', '23'), ('24', '24'), ('25', '25'), ('26', '26'), ('27', '27'), ('28', '28'), ('29', '29'), ('30', '30'), ('31', '31'), ('32', '32'), ('33', '33'), ('34', '34'), ('35', '35'), ('36', '36'), ('37', '37'), ('38', '38'), ('39', '39'), ('40', '40'), ('41', '41'), ('42', '42'), ('43', '43'), ('44', '44'), ('45', '45'), ('46', '46'), ('47', '47'), ('48', '48'), ('49', '49'), ('50', '50'), ('51', '51'), ('52', '52'), ('53', '53'), ('54', '54'), ('55', '55'), ('56', '56'), ('57', '57'), ('58', '58'), ('59', '59'), ('60', '60'), ('61', '61'), ('62', '62'), ('63', '63'), ('64', '64'), ('65', '65'), ('66', '66'), ('67', '67'), ('68', '68'), ('69', '69'), ('70', '70'), ('71', '71'), ('72', '72'), ('73', '73'), ('74', '74'), ('75', '75'), ('76', '76'), ('77', '77'), ('78', '78'), ('79', '79')], max_length=15, verbose_name='free fruit count'),
    ),
    migrations.RemoveField(
        model_name='product',
        name='miscellaneous',
    ),
    migrations.AddField(
        model_name='product',
        name='facility',
        field=models.ManyToManyField(blank=True, choices=[('apple', 'apple'), ('banana', 'banana')], to='food.FacilityCategory', verbose_name='facility '),
    ),
    migrations.AddField(
        model_name='product',
        name='miscellaneous',
        field=models.ManyToManyField(blank=True, choices=[('paper', 'paper'), ('dish', 'dish')], to='food.MiscellaneousCategory', verbose_name='misc'),
    ),
]

1 个答案:

答案 0 :(得分:0)

这是一个完整的猜测,所以请原谅我,如果我正在吠叫错误的树(或者只是完全吠叫!)

我猜测你的产品模型中已经有一堆数据,而你正在尝试删除两列不多的设备和杂项,并用两列相同名称的列替换它们。是不是很多领域,对吗?话虽如此,我认为您可能面临的一个问题是,当您创建新列时,它们不会填充您的食物模型的外键。所以你的后端数据库正在抛出摇摇晃晃的声音!我要做的就是设置:

Null = True

在您的产品型号中的新的多个字段中。但是,如果您不希望允许列为Null,则可能有效的另一个选项是设置:

Default = 1

(或食物模型中的其他一些适当值)。这将允许迁移在现有数据的每个记录上设置该值。

希望这有帮助。

相关问题