python - 如何更新 NDB 模型的架构

标签 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)

非常感谢!

最佳答案

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

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

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

现在,除非您处理的模型具有模式也可以更改的模型父类(super class),否则这会起作用。为了解决这个问题,当您想出要存储在 schema_version 中的值时,您需要在类层次结构中向上收集 SCHEMA_VERSION 的不同值。我们通过简单地将它们相加来收集它们以得出实体的官方“当前模式版本”,但也可以通过其他方式实现。

关于python - 如何更新 NDB 模型的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30424506/

相关文章:

google-app-engine - 无法通过本地服务器上的 Objectify 访问 App Engine 数据存储

python - 选择相关 选定相关

python - 对字典中的字典求和的函数

python - 使用 gensim 学习的打印二元组

android - 设备未从新的 Google Cloud Messaging (NEW GCM) 接收消息

python - 应用程序目录未显示在谷歌云外壳上

python - 如何获得最终重定向的网址

python - StructuredProperty 的重复嵌套属性

google-app-engine - 如何防止开发数据存储在重启时自行清除

python - 使用 Django 流式传输视频