迁移现有数据库字段。运行时出现E340错误

时间:2019-06-26 14:08:03

标签: mysql django pythonanywhere

大家好,我是Python Anywhere的新手,我在python 3.7上运行django应用程序,我已经通过SSH在MySQL Workbench中手动添加了所需的表和字段,然后运行[migrate.py inpectdb> / app / models.py]然后进行makemigrations,然后在运行Migrate时得到以下信息:

ERRORS: auth.Group.permissions: (fields.E340) The field's intermediary table 'auth_group_permissions' clashes with the table name of 'app.AuthGroupPermissions'. auth.User.groups: (fields.E340) The field's intermediary table 'auth_user_groups' clashes with the table name of 'app.AuthUserGroups'. auth.User.user_permissions: (fields.E340) The field's intermediary table 'auth_user_user_permissions' clashes with the table name of 'app.AuthUserUserPermissions'.

如果我从models.py中删除身份验证表并尝试迁移,则会得到:

File "/usr/lib/python3.7/site-packages/MySQLdb/connections.py", line 276, in query _mysql.connection.query(self, query) django.db.utils.OperationalError: (1071, 'Specified key was too long; max key length is 767 bytes')

根据我的阅读,它与settings.py [INSTALLED_APPS]冲突,但是我不确定从哪里可以使迁移正常进行。

1 个答案:

答案 0 :(得分:1)

您注意到的额外表是由Django创建的,因为您已在INSTALLED_APPS中启用了创建这些表的应用程序。从涉及的表名,我猜是django.contrib.auth在添加它们。可能还存在其他以这种方式创建的表,但是它们并不与您已经创建的表冲突。

您遇到的第二个错误是因为您试图在一个或多个列上创建键,而该键太大而不能作为键。那可能仍然是auth_表冲突的结果。例如,Django模型可能在表的ID上指定了一个键,并期望它是一个整数列,但您的数据库却使用了一个较大的ID字符串列。

我怀疑,只要您尝试使Django数据库和数据库位于同一数据库中,您就可能继续遇到问题。但是,Django确实支持multiple databases,因此您可以将旧数据库放在一个数据库中,而将Django数据库放在另一个数据库中。这样一来,他们就无法相互加强。