Django 重建所有迁移

Posted

技术标签:

【中文标题】Django 重建所有迁移【英文标题】:Django Rebuild all migrations 【发布时间】:2017-04-10 01:27:00 【问题描述】:

我正在 Django 中构建一个应用程序,它使用实时/使用中的数据库。

基本上,由于 SQL 数据库的应用程序开发经历了一些结构变化,并导致 Django 出现问题,Django 将尝试将迁移应用到已经存在的数据库。例如:

在 Django 应用程序中,我将 email 列标记为唯一,这基于开发数据库很好。但是,主数据库现在总是有一个表更改,将email 列标记为唯一。 Django 正在与已经存在的那个唯一的密钥作斗争。

那么与更新的 SQL 数据库结构相比,是否可以清除所有 Django 迁移并让它再次进行迁移?

【问题讨论】:

您必须选择是否希望 Django 管理您的数据库。如果您想对数据库进行自己的更改并让 Django 之后采用这些更改,而不是 Django 更改数据库本身,请考虑在您的模型中使用 managed = False 【参考方案1】:

如果您的模型与您的数据库非常不同步,最简单的选择可能是使用 inspectdb 从头开始​​重建您的模型。

如果您的模型已经非常接近数据库,那么第一步是确保您的模型与数据库完全匹配。为此,您可以使用 django-extensions 中的 sqldiff。

一旦您的 Django 模型与您的数据库匹配,请按照 this answer 根据现有数据库架构重新创建迁移。

【讨论】:

我的设置的问题不是所有的数据库表都被网站使用,大部分数据库被外部应用程序使用。所以我不能只检查或做一个 sqldiff。我可以删除所有迁移并重新制作连接到更新的数据库结构的迁移吗? @bmazoka 关键是您在数据库中使用的表和应用程序的模型需要相同。一种选择是在本地计算机上获取数据库的副本并删除您不使用的任何表。然后,您可以使用上述步骤创建迁移。 啊,我明白了。但是,如果我删除了所有迁移文件,Django 是否能够重新进行迁移?似乎是更简单的解决方案。如果我让它根据当前结构制作模型,我将丢失我对模型本身所做的所有更改以及我必须做的自定义事情。 删除迁移(例如,使用rm -rf **/migrations)很好,除非有任何自定义迁移。最佳做法是确保迁移是您的 git 存储库的一部分,以便您可以将它们取回以防万一。

以上是关于Django 重建所有迁移的主要内容,如果未能解决你的问题,请参考以下文章

在 couchdb 从 1.6.1 迁移到 2.3.1 期间,由于内存问题 couchup 实用程序需要大量时间重建视图

EF6 在原有数据库中使用 CodeFirst 总复习(重建迁移)

删除mysql数据库后django重建数据库

Django子类化multiwidget - 使用自定义multiwidget重建帖子日期

Django 2.0 haystack whoosh 更新索引,重建索引抛出错误

ES数据库重建索引——Reindex(数据迁移)