【问题标题】:Django migrate getting OperationalErrorDjango 迁移得到 OperationalError
【发布时间】:2016-09-09 17:24:22
【问题描述】:

我对 Django 很陌生,我使用的是 1.10 版本。我达到了由于错误而无法迁移的地步,因此使用 ./manage.py migrate myapp 0003_auto_20160426_2022 备份到较早的迁移并删除了以后的迁移文件。然后我修复了我的models.py 并运行了makemigrations,效果很好。但是当我尝试migrate时,我收到了以下错误(只显示最后几行)

文件 "/Users/wahhab/Sites/rts/env/lib/python3.5/site-packages/MySQLdb/connections.py", 第 280 行,查询中 _mysql.connection.query(self, query) django.db.utils.OperationalError: (1022, "Can't write; duplicate key in table '#sql-72_4a6'")

我不知道如何从这一点继续前进,以便我可以继续从事我的项目。我在其他应用程序中有数据,但到目前为止在这个新应用程序中只有一点测试数据,所以我考虑删除这个应用程序的所有迁移和 MySQL 表并重新开始,但我不想造成比我更糟糕的混乱有并且不知道是什么导致了这个错误。欢迎任何建议。谢谢!

【问题讨论】:

  • 迁移的问题在于,尽管他们有一个伟大的理念,但很难在一些只有非常有经验的开发人员才能解决的微小细节上维持生计。 My hackish approach 是始终销毁开发数据库,​​从备份重建它,然后 makemigrations。我有一个方便的脚本,我只是等待它完成。 Hackish 但它让我的精神状态更安全。

标签: django migrate


【解决方案1】:

好的,@raratiru 已经提出了 hackish 解决方案。

现在对为什么您遇到上述问题的解释是,当您删除迁移时,Django 会重置其所有计数器,其中还包括 key,但由于迁移的删除是手动删除的,因此数据仍会保留在您的数据库中。

因此,您的数据库中已经存在 key = 1、2、3 ....等的对象。但是 Django 不知道这一点,因此当您只删除迁移而不是数据时,Django 将面临键冲突,因为 Django 再次开始从 1 分配自动键值,该键值已经存在于数据库中。但由于 key 需要唯一,它会给您一个错误。

因此,如果您同时删除 迁移数据,您不会收到错误消息。

【讨论】:

  • 感谢您的解释。转到我的数据库,我看到 Django 创建了一些表。我尝试只删除与迁移相关的迁移条目,但这不起作用。所以我已经从我的其他应用程序中备份了表,接下来将尝试删除所有表,删除除初始迁移之外的所有迁移文件,并重建所有内容。我会告诉你这是否有效。
  • 我在不删除数据库的情况下成功解决了问题。我错过了为要删除的表创建授权的事实;当 migrate 尝试重新添加表并因此重新添加它们的授权时会导致问题。
  • 为了其他有此问题的人的利益,以下是我采取的基本步骤: 1. 删除迁移 2. 从 MySQL 中删除表 3. 从 django_migrations 表中删除条目 4. 从 django_content_type 中删除条目 5 . 从 auth_permission 中删除条目 6. 重新运行 makemigrations 并迁移。 (希望我在这里得到了一切;我也做了很多不必要的来回)。感谢 Ankush 和 @raratiru 的帮助。
猜你喜欢
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多