【问题标题】:django model change OneToOneField to ForeignKey with no DownTimedjango 模型将 OneToOneField 更改为 ForeignKey 而没有停机时间
【发布时间】:2021-05-22 08:05:23
【问题描述】:

我将 django 模型的一个字段设为 OneToOneField。因此,无法存储重复的 FK 值。我认为将 OneToOneField 更改为 ForeignKey 是解决方案。


当前

class MyModel(models.Model):
    ...
    abc = models.OneToOneField(YourModel, related_name='my_model', blank=True, null=True, on_delete=models.CASCADE)
    ...

未来

class MyModel(models.Model):
    ...
    abc = models.ForeignKey(YourModel, related_name='my_model', blank=True, null=True, on_delete=models.CASCADE)
    ...

问题是迁移时的停机时间。这个模型是我服务中的一个重要模型,很多请求都是一瞬间进来的。它也有很多数据。
有没有办法在不停机的情况下解决这个问题?

而我的服务使用的是 mysql 5.6 和 django 2.2。

【问题讨论】:

    标签: python mysql django django-models database-migration


    【解决方案1】:

    选项 a)

    嗯,所以数据库关系明智我看不出有什么区别,那么如果您只是调整模型定义中的字段并修改最初创建该字段的旧迁移呢?这样 Django 应该认为没有什么新东西可以应用并将原始 OneToOne 字段视为 ForeignKey 字段

    请先在备份上尝试一下,看看是否可能存在其他唯一约束,或者您可能必须在自定义 sql 命令中删除,然后才能拥有真正的 ForeignKey 字段。

    选项 b)

    使用多个迁移和部署。

    • 首先添加一个新字段(例如可以为空的 abc_new)
    • 调整您的逻辑,以便始终为新数据和更改填充两个字段
    • 在新版本中部署它
    • 将“旧”数据从abc 复制到abc_new
    • 此时您有两行包含完全相同的数据
    • 创建一个新版本,删除旧的abc 列并将abc_new 重命名为abc,并删除包含abc_new 字段的此“同步”逻辑的逻辑

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-15
      • 2016-06-30
      • 2014-06-11
      • 2011-08-17
      • 2021-04-20
      • 2017-08-06
      • 2011-11-12
      相关资源
      最近更新 更多