gpt4 book ai didi

django - 如何在 Django 中同时支持新旧数据库模式?

转载 作者:行者123 更新时间:2023-12-01 15:34:43 25 4
gpt4 key购买 nike

现状,遗留问题:

class Foo(models.Model)
field = models.BooleanField()

@property
def renamed_field(self):
return self.field

@renamed_field.setter
def renamed_field(self, value):
self.field = value

obsolete_field = models.BooleanField()

期望的情况:

class Foo(models.Model)
renamed_field = models.BooleanField()

还没有问题。 South 可以使用 db.rename_columndb.deletecolumn 处理迁移。

问题:我们的 Django 应用程序在具有共享 MySQL 实例的多个实例上运行。当我们将代码部署到生产环境时,我们会在启动新实例时用新实例一个接一个地替换旧实例。如果我们想避免停机,应用模型需要支持新的数据库方案,这里有一个要点:当实例被替换时,旧的数据库方案也会被替换。

我们希望避免停机。

一个简单的解决方案是分两步进行部署,等待所有实例被替换,迁移,并在迁移后立即启用 my_feature_switch:

class OldFoo(models.Model)
field = models.BooleanField()

@property
def renamed_field(self):
return self.field

@renamed_field.setter
def renamed_field(self, value):
self.field = value

obsolete_field = models.BooleanField()

class Meta:
abstract = True

class NewFoo(models.Model)
renamed_field = models.BooleanField()

class Meta:
abstract = True

if waffle.switch_is_active('my_feature_switch'):
foo_model = NewFoo
else:
foo_model = OldFoo

class Foo(widget_model_model):
pass

我希望这表明了可能解决方案的方向。它需要在某个时候进行另一个部署来清理它(基本上将 NewFoo 重命名为 Foo 并删除其他所有内容)。

上述解决方案的问题是我们需要重新启动所有实例以遵守新的 waffle 开关值。重新启动所有服务器是有问题的。它最好在运行时遵守条件(华夫饼开关)。

  • 还有其他方法可以使模型有条件吗?
  • 或者也许是一种完全不同的方法来解决这个问题?例如,每个字段可能有一个条件 db_column?

我们在 Django==1.6,South==1.0。

最佳答案

完全不同的解决方案,重命名对象字段,但使用 db_column 指定旧数据库列名称参数。

class Foo(models.Model)
renamed_field = models.BooleanField(db_column='obsolete_field')

无需迁移。

关于django - 如何在 Django 中同时支持新旧数据库模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25866367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com