3

我正在删除项目中的一些死代码,我有机会删除对我们自项目启动以来一直在使用的第三方应用程序的依赖。我们的一个模型在第三方应用程序中有一个模型的 ForeignKey,当我尝试在项目的新实例上应用迁移时遇到了麻烦。

示例模型:

from django.db import models
from thirdparty.models import ThirdPartyModel

class MyModel(models.Model):
    fk = models.ForeignKey(ThirdPartyModel)

South 检测到正在删除MyModel.fk,并且成功创建了迁移。应用迁移并将其回滚也可以。我现在可以删除thirdpartyINSTALLED_APPS提交更改(新的迁移和settings.py)。

当我在另一台机器上克隆存储库时,问题就开始了。 ./manage.py syncdb按预期运行并创建所有不由 South 管理的表,但./manage.py migrate myapp在为(早期版本)创建表时失败,因为无法创建MyModel外键(如预期的那样,因为不再存在,因此没有创建任何表)。thirdparty_thirdpartymodelthirdpartyINSTALLED_APPS

是否有标准方法来处理删除外部依赖项?现在是重置我的迁移的合适时间吗?

4

1 回答 1

0

这是一个老问题,但它仍然有效,甚至独立于 South,并且也是 Django Migrations 的一个问题。

您应该注意将迁移文件分开,以便您可以伪造依赖于不存在的应用程序(从 中删除INSTALLED_APPS)的迁移。这样,您将通过伪造这些迁移来创建新安装,并在现有安装上实际运行这些迁移。

当然,如果您有可能重新开始(例如完全重新启动),您可以擦除数据库,删除所有现有的迁移文件并简单地创建全新的迁移。所有其他开发人员也必须放弃他们的数据库。

如果您有现有的生产数据并且仍想从头开始,那么如何传输数据有不同的可能性。哪种方式最好取决于有多少数据,结构发生了多少变化等:

  • 普通 SQL(手动更改数据库,在运行新迁移后,通过将数据从旧表转移到新表并删除表和外键等)
  • 固定装置(通过旧系统中的 Django 转储数据并更改 JSON 以适应新结构)
  • 新旧系统的两个并行安装并通过 Django/Python 脚本传输(比普通 SQL 慢,但您可以使用 Django 模型逻辑,以更舒适的方式应用验证检查、转换等)。

当然,不要在生产中执行此操作,而是在其他地方执行此操作,然后简单地应用结果。

于 2016-01-13T08:45:55.933 回答