【问题标题】:how to cleanly remove ndb properties如何干净地删除 ndb 属性
【发布时间】:2012-09-23 13:25:10
【问题描述】:

在我的应用程序中,我需要删除我的一些模型属性。
我检查了this link,但第一个问题是属性位于polymodel 上,我无法切换到expando 来删除属性,我什至不知道如果发生什么情况我将polymodel 更改为expando

那么我如何从现有实体中删除属性?

我正在考虑将所有 StringProperty 设置为 None,然后从模型架构中删除这些并重新部署。 其中一个属性是BooleanProperty,我不能将其设置为None,对吧?! 或ndb.PickleProperty...我应该如何删除它?

有人知道如何正确完成这项工作吗?

【问题讨论】:

    标签: python google-app-engine app-engine-ndb polymodel


    【解决方案1】:

    如果您想更新所有实体,推荐的方法是读取和重写所有实体的 map/reduce 作业;但是,这可能不值得,这取决于您拥有多少数据——map/reduce 也不是免费的。

    还要确保在一小部分数据上测试 map/reduce 作业。真正从实体中删除属性是非常微妙的,即使它不再在模型类中!最好的方法可能是:

    if 'propname' in ent._properties:
      del ent._properties['propname']
      ent.put()
    

    【讨论】:

    • 谢谢你!是的,我必须评估它是否真正有价值……我有大约 100k 个实体,因此从架构中删除该属性甚至可以。如果我删除该属性,重新部署然后重新命名该实体,会发生什么?这会丢弃这些属性还是我仍然需要从对象中删除它们?
    • 架构更改后的reputing 不会删除属性值。 (这是一个经过深思熟虑的功能,旨在最大限度地提高应用程序的两个版本之间的互操作性。)
    • 如果我有兴趣将属性设置为 None 因为我将重新填充这些属性,我有什么选择?
    • 在上面的代码sn-p中有一个微妙的陷阱:_properties不一定是实体实例的属性,它也是模型类的属性。因此,上面的代码可能会改变类,导致奇怪的错误和不一致。解决方法是在 del 语句之前调用 ent._clone_properties(),该语句负责将类属性克隆到实例。
    • 我执行了上述操作,但该列在我的云控制台表视图中仍然可见,尽管值不存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2018-11-15
    相关资源
    最近更新 更多