【问题标题】:appengine: how can I check if a property from an entity exists in the datastore?appengine:如何检查数据存储区中是否存在来自实体的属性?
【发布时间】:2011-07-06 15:12:02
【问题描述】:

我知道无法查询数据存储中的缺失值(请参阅question)。

python 代码呢?是否可以检查实体属性的值是来自数据存储区还是来自默认值?

用例:

模型 Kind_X 有 1000 个实体。对于属性 Kind_X.my_property

  • 500 个实体没有 my_property
  • 400 个实体 my_property 为无
  • 100 个实体是其他值

我想将 my_property 设置为 ABC 仅用于那些没有该属性的 500 个实体。值为 None 的 400 个实体无法修改。

注意:将 my_property 默认设置为 ABC 是不可接受的解决方案。

【问题讨论】:

  • 如果您不理解该问题,您不应随意给出答案,也不应将其标记为重复...
  • 并非如此,如果您 想确保所有实体都将作为查询的结果显示,就像您评论的那样,那么答案就是这样做的方法。哦,可能是你自己不知道自己在问什么。

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


【解决方案1】:

使用高级ext.db 框架无法做到这一点。您可以使用较低级别的google.appengine.api.datastore 框架检索数据(文档在文档字符串中)。

为什么需要区分这两种情况?可能有更好的方法。

【讨论】:

  • 我想确保所有实体都会作为查询的结果显示出来。
  • @schettino72 然后,您应该在引入新属性时运行 mapreduce 或其他过程来检索和存储每个实体。
【解决方案2】:

您可以遍历给定种类的所有实体并以编程方式对其进行检查:

entities = Model.all()
for entity in entities :
  if not entity.newproperty :
    print "Hey, this entity is missing something"

如果实体的数量很大,你应该使用mapreduce库来避免超时。

【讨论】:

  • 如果您存储了重要的数字,您将超时尝试此操作。您需要分批进行。您可以使用任务滚动自己的批处理,或使用内置批处理的 mapreduce。
【解决方案3】:

如果您没有大量数据,您可以执行 map reduce 并将所需实体的键存储在一个只有 ListProperty 保存键的新模型中。 这是一种肮脏的黑客攻击,仅适用于少于 5k 的实体。它还会创建大量元数据,所以要小心

【讨论】:

    【解决方案4】:
    from google.appengine.api import datastore
    
    entity_key = 'ag1lbmdlbG1pbmFzd2VicgoLEgRVc2VyGGIM' 
    entity = datastore.Get(entity_key)
    print 'my_property' in entity
    

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多