【问题标题】:App Engine Datastore IN Operator - how to use?App Engine Datastore IN 运算符 - 如何使用?
【发布时间】:2010-11-03 10:42:48
【问题描述】:

阅读:http://code.google.com/appengine/docs/python/datastore/gqlreference.html

我想使用:

:= 在

但我不确定如何使它工作。让我们假设以下内容

class User(db.Model):
    name = db.StringProperty()

class UniqueListOfSavedItems(db.Model):
    str = db.StringPropery()
    datesaved = db.DateTimeProperty()

class UserListOfSavedItems(db.Model):
    name = db.ReferenceProperty(User, collection='user')
    str = db.ReferenceProperty(UniqueListOfSavedItems, collection='itemlist')

如何进行查询以获取用户已保存项目的列表?显然我可以做到:

q = db.Gql("SELECT * FROM UserListOfSavedItems WHERE name :=", user[0].name)

但这给了我一个键列表。我现在想获取该列表并将其放入查询中以从 UniqueListOfSavedItems 中获取 str 字段。我以为我能做到:

q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems WHERE := str in q")

但有些不对劲...有什么想法吗?是吗(我在做我的日常工作,所以现在无法测试):

q2 = db.Gql("SELECT * FROM UniqueListOfSavedItems __key__ := str in q)

旁注:这是一个非常难搜索的问题,因为我真正关心的是“IN”运算符。

【问题讨论】:

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


    【解决方案1】:

    +1 感谢 Adam 让我走上正轨。根据他的指示,并在代码搜索中进行一些搜索,我有以下解决方案。

    usersaveditems = User.Gql(“Select * from UserListOfSavedItems where user =:1”, userkey)
    
    saveditemkeys = []
    
    for item in usersaveditems:
        #this should create a list of keys (references) to the saved item table
        saveditemkeys.append(item.str())    
    
    if len(usersavedsearches > 0):
        #and this should get me the items that a user saved
        useritems = db.Gql(“SELECT * FROM UniqueListOfSavedItems WHERE __key__ in :1’, saveditemkeys)
    

    【讨论】:

      【解决方案2】:

      由于您有一个键列表,因此您无需进行第二次查询 - 您可以进行批量提取。试试这个:

      #and this should get me the items that a user saved
      useritems = db.get(saveditemkeys)
      

      (请注意,您甚至不需要保护子句 - 0 个实体上的 db.get 已适当短路。)

      你可能会问有什么区别?好吧,一个 db.get 大约需要 20-40 毫秒。另一方面,查询(GQL 与否)大约需要 160-200 毫秒。但是等等,情况会变得更糟! IN 运算符在 Python 中实现,并转换为多个查询,这些查询是串行执行的。因此,如果您使用 IN 过滤器对 10 个键进行查询,您将执行 10 次单独的 160 毫秒查询操作,总共大约 1.6 秒的延迟。相比之下,单个 db.get 将具有相同的效果,总共需要大约 30 毫秒。

      【讨论】:

      • 多么棒的答案...我将在今晚实施。我得到了代码工作(是的!)所以优化可以稍后进行。 :) 现在我在使用正则表达式。敲打。头。在。键盘。
      • Brandon - 我使用了一个名为 regexbuddy 的应用程序,它很有帮助。与他们没有任何关联。
      猜你喜欢
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 2019-10-15
      相关资源
      最近更新 更多