如何组合GQL查询

时间:2013-07-22 19:22:25

标签: python gql

所以我正在为我的应用程序制作内部混乱系统。我需要选择用户是发件人或收件人的所有邮件。

GQL不支持“OR”查询,因此我需要运行两个查询,将它们(结果)和ORDER BY created DESC合并。

不幸的是我在Python中找不到任何文档或示例如何做到这一点。

PS:我的猜测是db.GqlQuery("SELECT * FROM Messages WHERE sender_id = :1 ORDER BY created DESC UNION SELECT * FROM Messages WHERE receiver_id = :1 ORDER BY created DESC", user_id)

PPS。:我使用Python的解决方法。

def get_messages(user_id):
    sender_query = db.GqlQuery("SELECT * FROM Messages WHERE sender_id = :1 ORDER BY created DESC", user_id)
    receiver_query = db.GqlQuery("SELECT * FROM Messages WHERE receiver_id = :1 ORDER BY created DESC", user_id)

    message_query = []

    for q in sender_query:
        message_query.append(q)

    for q in receiver_query:
        if q not in message_query: #doesn't work if user sent a message to himself (different instaces of same entity)
            message_query.append(q)

    message_query.sort(key=operator.attrgetter('created'))

    return message_query

仍在寻找GQL-algebra-ish解决方案

1 个答案:

答案 0 :(得分:0)

看起来像一个很好的解决方案。 App Engine DB有其局限性,它为您留下了很多工作。我注意到你正在使用DB;您考虑过迁移到NDB吗?它是下一代数据库:https://developers.google.com/appengine/docs/python/ndb/

NDB解决了DB的许多缺点。首先,它支持“OR”查询甚至是AND和OR的嵌套组合:https://developers.google.com/appengine/docs/python/ndb/queries#nest_and_or

如果您发现自己花费大量时间编写代码只是为了对数据库进行基本查询,那么此举可能是一项很好的投资。