2013-07-22 68 views
1

因此,我正在爲我的應用程序製作一個內部消息系統。我需要選擇用戶是發送者還是接收者的所有消息。如何結合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代數上下的解決方案

回答

0

看起來像一個精緻的解決方案。 App Engine DB有其侷限性,它爲您留下了許多工作。我注意到你正在使用DB;你有沒有考慮遷移到NDB?這是下一代數據庫:https://developers.google.com/appengine/docs/python/ndb/

NDB解決了很多數據庫的缺點。首先,它支持「或」查詢,甚至是AND和OR的嵌套組合:https://developers.google.com/appengine/docs/python/ndb/queries#nest_and_or

如果你發現自己花很多時間編寫代碼來做DB的基本查詢,那麼這個舉動可能是良好的投資。