【问题标题】:Migrate existing database fields.E340 error on run迁移现有数据库字段。运行时出现 E340 错误
【发布时间】:2019-11-08 12:24:38
【问题描述】:

大家好,我是 Python Anywhere 的新手,我在 python 3.7 上运行一个 django 应用程序,我已经通过 MySQL Workbench 中的 SSH 手动添加了我需要的表和字段并运行了 [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] 冲突,但我不确定从这里到哪里才能使迁移正常工作。

【问题讨论】:

  • 为什么“在 MySQL Workbench 中通过 SSH 手动添加我需要的表和字段”?这就是迁移的目的。是什么让您认为您需要这样做?
  • 很酷的故事兄弟。感谢您的状态报告。
  • 数据库是旧系统,来自旧系统。有很多我需要访问的预填充数据,这只是我阅读的指南中最简单的方法。
  • 这里只是关于同一主题的讨论的注释:pythonanywhere.com/forums/topic/14430

标签: mysql django pythonanywhere


【解决方案1】:

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

您遇到的第二个错误是因为您尝试在一个(或多个)列上创建一个键,该键太大而不能成为键。这可能仍然是 auth_ 表冲突的结果。例如,Django 模型可能会在表的 id 上指定一个键,期望它是一个整数列,但您的数据库有一个大的字符串列来代替 id。

我怀疑只要您尝试让 Django 数据库和您的数据库位于同一个数据库中,您可能会继续遇到问题。然而,Django 确实支持multiple databases,因此您可以将旧数据库放在一个数据库中,而将您的 Django 数据库放在另一个数据库中。这样一来,他们就没有办法踩到对方了。

【讨论】:

  • 感谢 Glenn 的解释,现在我知道发生了什么,我能够保留我想使用的模型并移动到另一个数据库并毫无问题地迁移它们。我很欣赏这真的很有帮助的细节!
猜你喜欢
  • 1970-01-01
  • 2019-02-14
  • 2020-11-28
  • 2016-06-14
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多