【问题标题】:Where clause in Google App Engine DatastoreGoogle App Engine 数据存储区中的 Where 子句
【发布时间】:2015-12-15 03:39:54
【问题描述】:

我的 Resource 类的模型如下:

class Resource(ndb.Model):
    name = ndb.StringProperty()
    availability = ndb.StructuredProperty(Availability, repeated=True)
    tags = ndb.StringProperty(repeated=True)
    owner = ndb.StringProperty()
    id = ndb.StringProperty(indexed=True, required=True)
    lastReservedTime = ndb.DateTimeProperty(auto_now_add=False)
    startString = ndb.StringProperty()
    endString = ndb.StringProperty()

我想提取所有者等于某个字符串的记录。 我已经尝试了以下查询。它不会给出错误,但也不会返回任何结果。

Resource.query(Resource.owner== 'abc@xyz.com').fetch()

根据我的理解,如果列具有重复值,则不应对其编制索引,这就是不编制所有者索引的原因。如果我错了,请纠正我。

谁能帮我弄清楚如何实现 where 子句类型的功能?

感谢任何帮助!谢谢!

【问题讨论】:

  • 您确定有Resource 实体的所有者属性等于'abc@xyz.com'?据我所知,这对我来说是正确的。
  • @mgilson:嘿!是的,我确信有些记录应该与该值匹配。事实上,我的数据存储中唯一的记录是这个所有者的记录,当我从 DS 中提取所有记录(如 select * 语句)时,我能够正确检索所有记录。
  • 试试Resource.gql("WHERE owner = :1", 'abc@xyz.com').fetch()

标签: python google-app-engine


【解决方案1】:

刚试过这个。它第一次起作用。要么您没有所有者为“abc@xyz.com”的资源实体,要么在放置实体时没有为所有者属性编制索引(如果在放置实体时您已 indexed=False,则会发生这种情况)。

我的测试:

Resource(id='1', owner='abc@xyz.com').put()
Resource(id='2', owner='abc@xyz.com').put()
resources = Resource.query(Resource.owner == 'abc@xyz.com').fetch()
assert len(resources) == 2

另外,您的评论:

根据我的理解,如果一列有重复的值,它不应该 被索引,这就是为什么没有索引所有者。请纠正我如果 我错了。

你错了!

首先,数据存储模型中没有“列”的概念,所以我假设您的意思是“Property”。

接下来,澄清“如果 column 属性具有重复值”的含义:

  • 我假设您的意思是“从同一模型创建的多个实体,对于特定属性具有相同的值”,在您的情况下是“所有者”。这对索引没有影响,每个实体都将按预期编入索引。
  • 或者您的意思是“具有允许多个值(即列表)的属性的单个实体”,这也不会阻止索引。在这种情况下,实体将被多次索引,列表中的每个项目一次。

更详细地说,大多数属性(即接受原始类型如字符串、int、float 等的属性)都会自动索引,除非您将属性indexed=False 添加到Property 构造函数中。事实上,您真正需要担心索引的唯一时间是当您需要执行更复杂的查询时,这涉及查询超过 1 个属性(即使这样,默认情况下,应用程序引擎开发服务器也会自动创建索引)您在本地 index.yaml 文件中),或使用不等式过滤器。

readthedocs了解更多详情。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    相关资源
    最近更新 更多