gpt4 book ai didi

mysql - 无法在 Django 1.11 中生成迁移

转载 作者:行者123 更新时间:2023-11-29 18:19:55 25 4
gpt4 key购买 nike

在一个空白的 MySQL 数据库上,我使用以下命令为 Django 1.11 项目生成了迁移:

python manage.py makemigrations

我有几个自定义的相互依赖的应用程序,但生成的所有迁移都没有错误。但是,当我尝试应用这些迁移时:

python manage.py migrate

它可以很好地应用大多数应用程序迁移,但对于一些自定义 FeinCMS 迁移来说:

  Applying page.0001_initial...Traceback (most recent call last):
File "manage.py", line 9, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
utility.execute()
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 356, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 204, in handle
fake_initial=fake_initial,
File "/usr/local/myproject/.env/local/lib/python2.7/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 "/usr/local/myproject/.env/local/lib/python2.7/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 "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/migrations/executor.py", line 244, in apply_migration
state = migration.apply(state, schema_editor)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 93, in __exit__
self.execute(sql)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 120, in execute
cursor.execute(sql, params)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
six.reraise(dj_exc_type, dj_exc_value, traceback)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute
return self.cursor.execute(sql, params)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 101, in execute
return self.cursor.execute(query, args)
File "/usr/local/myproject/.env/local/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
self.errorhandler(self, exc, value)
File "/usr/local/myproject/.env/local/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')

不幸的是,它没有说明未生成哪个外键,并且迁移有多个外键。我尝试注释掉迁移中的每个字段并重新运行它,但是当我这样做时迁移会成功。

为什么此迁移失败以及如何修复它?

最佳答案

您在 Django 创建的表中遇到问题,该表没有 INNODB ENGINE

在MySql中如果表有INNODB ENGINE可以将关系作为外键,否则Django将返回问题中提到的错误

"django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')"

我有解决这个问题的方法。首先创建新的管理命令文件,名称为“convert_to_innodb”

并在该管理命令文件中添加如下代码

from django.core.management.base import BaseCommand
from django.db import connections


class Command(BaseCommand):
def handle(self, database="default", *args, **options):
cursor = connections[database].cursor()
cursor.execute("SHOW TABLE STATUS")
for row in cursor.fetchall():
if row[1] != "InnoDB":
print "Converting %s" % row[0],
print cursor.execute("ALTER TABLE %s ENGINE=INNODB" % row[0])

和终端中的 RUN 命令

python manage.py convert_to_innodb

执行此命令后,您可以在已创建的表中创建外键,但是

'OPTIONS': {
'init_command': 'SET default_storage_engine=INNODB',
}

在数据库设置中添加此配置,如下所示

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'DB_NAME',
'USER': 'DB_USER',
'PASSWORD': 'DB_PASSWORD',
'HOST': 'localhost', # Or an IP Address that your DB is hosted on
'PORT': '3306',
'OPTIONS': {
'init_command': 'SET default_storage_engine=INNODB',
}
}
}

此数据库配置将创建下次 INNODB ENGINE 表,该表将在未来正常工作而不会出现错误

关于mysql - 无法在 Django 1.11 中生成迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46672556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com