如何更新NDB模型的架构

3 python google-app-engine app-engine-ndb google-cloud-datastore

我已经使用App Engine的旧数据库数据存储API看到了这个问题的解决方案,但在使用较新的NDB API 时无法找到解决方案.

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

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

class Picture(ndb.Model):
    author = ndb.StringProperty()
    png_data = ndb.BlobProperty()
    name = ndb.StringProperty(default='')  # Unique name.
Run Code Online (Sandbox Code Playgroud)

对于这样的更新:

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)
Run Code Online (Sandbox Code Playgroud)

非常感谢!

Owe*_* S. 5

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

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

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

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