【问题标题】:Django migrations duplicate/already exists problemDjango迁移重复/已经存在问题
【发布时间】:2022-01-17 15:56:23
【问题描述】:

我在 django 中有一个相当大的代码库,有几个应用程序,在某些时候我遇到了一个问题:每次我更改或添加模型并尝试进行迁移时,都会出现错误:django.db.utils。 ProgrammingError:关系“appname_modelname”已经存在。问题已经持续了一段时间 - 迁移文件总是在相同的编号下创建 - 0114(顺便说一下,我找不到这个文件),并且所有新的修复程序都与以前的修复程序一起记录在其中,这就是问题不断扩大的原因,就像滚雪球一样。

我不想深入研究解决方案,只是手动从数据库中删除了所有创新 - 导致“已经存在”冲突出现的所有内容。因此,为了使迁移成功,我不得不手动删除我在出现此问题后创建的所有模型或表字段。但是现在我开始使用此代码在 prod 中工作并用数据填充它,并且不再可能从相应的表中删除所有数据。我不知道为什么会出现这个问题以及如何解决它,非常感谢您的建议。

我试图制作一个假的,但很明显,我需要的修复程序根本没有进入数据库。 我对造成这种情况的原因有一个假设:我有三个 docker 容器,一个 api 和两个用于 celery。在api容器中,我在启动时将命令写在bash文件中

python3 /usr/srv/h_api/src/manage.py makemigrations && python3 /usr/srv/h_api/src/manage.py migrate

而不是

python3 /usr/srv/h_api/src/manage.py makemigrations

所以我不必每次都手动进行。我不明白为什么,但从时间的巧合来看,问题似乎是因为这个而开始的。自从我把那条线改回来已经有几个星期了,但问题仍然存在。

如何将之前的更改提交到数据库并让 django 创建下一个编号为 0115 的迁移文件?

【问题讨论】:

  • 您是否尝试过伪造 0114,然后进行迁移以创建 0115?
  • @mendespedro 刚试过。我为一个模型做了一个测试场。是否 ...migrate --fake,然后再次进行迁移。收到响应“未检测到更改”。但是,当我尝试在管理面板中打开这个模型时,发生了编程错误,因为这个字段不在数据库中。
  • @mendespedro 之后,我删除了这个字段,重建了容器,一开始,makemigrations 再次制作了 0114 文件,一切都与我上次假迁移的一样

标签: python django postgresql migration


【解决方案1】:

这可能有点冒险,但过去它对我有用。我建议在另一个文件夹中创建项目的副本,并在远离原始项目的情况下安全地尝试。此外,如果您使用的是 postgresql 数据库,那么只需切换到虚拟数据库,虽然它不应该有所作为,但只是为了更安全。

在迁移文件夹中,在 app 文件夹中,尝试删除 pycache 中的所有文件,除了 init.cpython-39.pyc 和 0001_initial.cpython- 39.pyc 和迁移文件夹内删除所有文件,除了 init.py 和 0001_initial.py。

重要提示:从迁移内部的 pycache 中删除,而不是迁移外部的。

【讨论】:

    【解决方案2】:

    下面的方法经常帮助我,如果它是一个生产数据库,那么在开始之前备份你的迁移文件夹也是很好的。

    • 首先删除您当前的应用程序迁移文件夹
    • 暂时向您的模型添加一个字段。
    • 先迁移,然后迁移
    • 从您的模型中删除临时添加的字段
    • Makemigrations 和迁移

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2012-03-11
    • 2018-04-07
    • 2019-11-17
    • 2015-09-01
    • 2020-03-03
    • 2017-07-09
    • 2015-11-16
    • 2015-04-28
    • 2011-03-31
    相关资源
    最近更新 更多