如何更新 NDB 模型的架构
How to update an NDB Model's Schema
我已经使用 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 整数 属性。这将是存储模型时处于活动状态的架构版本。
- 为每个模型添加一个class属性
SCHEMA_VERSION
,代表代码的当前模式版本。它默认为 0,每当我们在模型上 add/remove/change NDB 属性时,我们都会将其提高。
- 让我们的模型实现一个
updateSchema
方法,该方法可以查看存储的和当前的版本并执行适当的迁移。
- 在实体加载期间,我们检查我们加载的实体的架构版本是否已过时。如果是,我们先调用
updateSchema
来修复实体,然后再从我们的数据层 return 实体。然后我们将 schema_version
设置为 SCHEMA_VERSION
. 的值
这种方法意味着我们正在按需更新架构。如果我们 运行 进入我们确实希望立即更新特定类型的所有实体的情况,我们将编写一个 map/reduce 操作来加载和保存该类型的每个实体;模式迁移作为该过程的一部分自动发生,不会导致停机。
现在,这有效,除非您处理的模型具有模型超classes,其模式也可以更改。为了解决这个问题,当您想出要存储在 schema_version
中的值时,您需要在 class 层次结构中向上收集 SCHEMA_VERSION
的不同值。我们通过简单地将它们相加得出实体的官方 "current schema version" 来收集它们,但也可以使用其他方法。
我已经使用 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 整数 属性。这将是存储模型时处于活动状态的架构版本。 - 为每个模型添加一个class属性
SCHEMA_VERSION
,代表代码的当前模式版本。它默认为 0,每当我们在模型上 add/remove/change NDB 属性时,我们都会将其提高。 - 让我们的模型实现一个
updateSchema
方法,该方法可以查看存储的和当前的版本并执行适当的迁移。 - 在实体加载期间,我们检查我们加载的实体的架构版本是否已过时。如果是,我们先调用
updateSchema
来修复实体,然后再从我们的数据层 return 实体。然后我们将schema_version
设置为SCHEMA_VERSION
. 的值
这种方法意味着我们正在按需更新架构。如果我们 运行 进入我们确实希望立即更新特定类型的所有实体的情况,我们将编写一个 map/reduce 操作来加载和保存该类型的每个实体;模式迁移作为该过程的一部分自动发生,不会导致停机。
现在,这有效,除非您处理的模型具有模型超classes,其模式也可以更改。为了解决这个问题,当您想出要存储在 schema_version
中的值时,您需要在 class 层次结构中向上收集 SCHEMA_VERSION
的不同值。我们通过简单地将它们相加得出实体的官方 "current schema version" 来收集它们,但也可以使用其他方法。