1

所以我正在为我的应用程序制作一个内部消息系统。我需要选择用户是发送者或接收者的所有消息。

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 解决方案

4

1 回答 1

0

看起来是一个很好的解决方案。App Engine 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

如果您发现自己花费大量时间编写代码只是为了在 DB 上进行基本查询,那么此举可能是一项不错的投资。

于 2013-08-02T01:56:59.113 回答