升级GAE应用程序时,升级数据模型的最佳方法是什么?
应用程序的版本号允许分隔多个版本,但这些应用程序版本使用相同的数据存储(根据How to change application after deployed into Google App Engine?)。那么当我上传一个具有不同数据模型的应用程序版本时会发生什么(我在想这里的python,但问题也应该对Java有效)?我想如果更改添加一个可空字段和一些新类,这应该不是问题,因此可以扩展现有模型而不会造成伤害。但是,如果数据模型的变化更加深刻呢?如果现有数据与新数据模型不一致,我实际上是否会丢失它?
我目前看到的唯一选择是将数据存储置于维护只读模式,将数据转换为脱机并再次部署整个数据。
答案 0 :(得分:6)
处理这种情况的方法很少,而且它们并不相互排斥:
getattr(entity, "field_name", default_value)
而非entity.field_name
访问该字段,以便它不会导致AttributeError
旧实体。逐渐将实体转换为新格式。这很简单:如果您发现仍然使用旧模型的实体,请进行适当的更改。在上面的示例中,您可能希望将实体放回,并添加新字段:
if not hasattr(entity, "field_name"):
entity.field_name = default_value
entity.put()
val = entity.field_name # no getattr'ing needed now
理想情况下,您的所有实体最终都会以这种方式处理,您可以在某个时候删除转换代码。实际上,总会有一些残留物应该手动转换 - 这就把我们带到了第三个选项......