Django Rebuild all migrations
我正在Django构建一个应用程序,它使用一个实时/正在使用的数据库。
基本上,由于应用程序的开发,SQL数据库已经发生了一些结构变化,并且它导致了Django的问题,Django将尝试将迁移应用到已经存在的数据库。例如:
在django应用程序中,我将email列标记为唯一的,基于开发数据库,这很好。但是,主数据库现在总是有一个表更改,将email列标记为唯一。Django正在用一把已经存在的钥匙与这把独特的钥匙作斗争。
那么,与最新的SQL数据库结构相比,是否可以清除所有Django迁移并再次进行迁移?
- 您必须选择是否希望Django管理您的数据库。如果您想对数据库进行自己的更改,并让django在之后采用这些更改,而不是django更改数据库本身,请考虑在您的模型中使用managed = False。
如果您的模型与数据库非常不同步,最简单的选择可能是使用inspectdb从头开始重建模型。
如果模型已经非常接近数据库,那么第一步就是确保模型与数据库完全匹配。您可以为此使用django扩展中的sqldiff。
一旦Django模型与数据库匹配,请按照此答案基于现有数据库模式重新创建迁移。
- 我的设置存在的问题不是所有的数据库表都被网站使用,并且大多数数据库都被外部应用程序使用。所以我不能只检查或执行sqldiff。我可以删除所有迁移并重新创建连接到更新的数据库结构的迁移吗?
- @bmazoka关键是数据库中使用的表和应用程序的模型必须相同。一个选项是复制本地计算机上的数据库,并删除不使用的任何表。然后您可以使用上面的步骤创建迁移。
- 啊,我明白了。但是,如果我删除了所有迁移文件,Django是否能够重新创建迁移?似乎更容易解决。如果我让它基于当前的结构创建模型,我将丢失对模型本身所做的所有更改以及必须执行的自定义操作。
- 删除迁移(例如,使用rm -rf **/migrations)是可以的,除非有任何自定义迁移。最佳实践是确保迁移是Git回购的一部分,这样您就可以在万一的情况下将迁移恢复回来。