【问题标题】:Return missing values in google app engine query在谷歌应用引擎查询中返回缺失值
【发布时间】:2021-08-27 12:37:52
【问题描述】:

在谷歌应用引擎中,假设我有一个父实体和一个子实体:

class Parent(ndb.Model):
    pass
class Child(ndb.Model):
    parent_key = ndb.KeyProperty(indexed = True)
    ... other properties I don't need to fetch ...

我有一个父母的钥匙列表,比如parents_list,我正试图有效地回答:parents_list 中的哪个父母有一个孩子。

理想情况下,我会运行这个查询:

children_list = Child.query().filter(Child.parent_key = parents_list).fetch(projection = 'parent_key')

由于投影属性(parent_key)在相等过滤器中,它不起作用。所以我必须检索所有属性,这似乎效率低下。

有没有办法有效地解决这个问题?

【问题讨论】:

    标签: python google-app-engine


    【解决方案1】:

    您的子模型实际上应该是

        class Child(ndb.Model):
            parent_key = ndb.KeyProperty(kind="Parent", indexed = True)
    

    如果您在 Python2 中执行此操作,则可以使用 ndb_tasklet(请参见下面的代码;请注意,我自己没有执行此代码,因此不能保证它可以正常工作;它只是作为指导,但我过去曾使用过小任务)。如果是 python3,尝试创建异步查询

        class Parent(ndb.Model):
    
            @classmethod
            def parentsWithChildren(cls, parents_list):
            
                @ndb.tasklet
                def child_callback(parent_key):
                    q = Child.query(Child.parent_key == parent_key)
                    output = yield q.fetch_async(projection = 'parent_key')
    
                    raise ndb.Return ((parentKey, output))
    
                # For each key in parents_list, invoke the callback - child_callback which returns a result only if the parent_key matches
                # ndb.tasklet is asynchronous so code is run in parallel
                final_output = [ child_callback(a) for a in parents_list]
    
                return final_output
    

    【讨论】:

    • 非常感谢!我正在使用python3,异步查询循环是个好主意,它的速度可能与批处理相当。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多