如何更新NDB模型的架构

时间:2015-05-24 14:18:50

标签: python google-app-engine google-cloud-datastore app-engine-ndb

我已经使用App Engine's older DB Datastore API看到了此问题的解决方案,但在使用较新的 NDB API时无法找到解决方案。

添加迁移支持的最佳方式是什么,以便我能够从旧版本的架构迁移到新版本。编写迁移脚本是最好的,这将如何运作?

像迁移这样的模式(注意样本在 NDB 中):

class Picture(ndb.Model):
    author = ndb.StringProperty()
    png_data = ndb.BlobProperty()
    name = ndb.StringProperty(default='')  # Unique name.

对于这样的更新版本:

class Picture(ndb.Model):
    author = ndb.StringProperty()
    png_data = ndb.BlobProperty()
    name = ndb.StringProperty(default='')  # Unique name.

    num_votes = ndb.IntegerProperty(default=0)
    avg_rating = ndb.FloatProperty(default=0)

非常感谢!

1 个答案:

答案 0 :(得分:5)

据我所知,NDB没有任何内置的架构迁移支持。我们以这种方式处理模式迁移:

  • 为我们使用的每个模型添加一个名为schema_version的NDB整数属性。这将是存储模型时处于活动状态的模式版本。
  • 为每个Model添加一个类属性SCHEMA_VERSION,表示代码的当前架构版本。它默认为0,每当我们在模型上添加/删除/更改NDB属性时,我们都会对此进行修改。
  • 让我们的模型实现updateSchema方法,该方法可以查看存储的和当前版本并执行适当的迁移。
  • 在加载实体期间,我们检查我们加载的实体的架构版本是否已过期。如果是,我们会在从数据层返回实体之前调用updateSchema来修复实体。然后,我们将schema_version设置为SCHEMA_VERSION
  • 的值

这种方法意味着我们正在按需更新架构。如果我们遇到一种情况,我们真的希望现在更新特定类型的所有实体,我们编写一个map / reduce操作来加载和保存该类型的每个实体;模式迁移作为该过程的一部分自动发生,而不会导致停机。

现在,除非您正在处理模型超类的模型,否则它们的模式也可以更改。要解决这个问题,当您想出一个值存储在SCHEMA_VERSION中时,需要在类层次结构中收集schema_version的不同值。我们通过简单地总结它们以得出实体的官方“当前模式版本”来收集它们,但是其他方法也是可能的。