2009-06-16 47 views
3

閱讀:http://code.google.com/appengine/docs/python/datastore/gqlreference.htmlApp Engine數據存儲IN操作員 - 如何使用?

我想用:

:= IN

但我不確定如何使其發揮作用。我們假設以下內容:

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」操作符。

回答

9

既然你有一個鍵的列表,你不需要做第二個查詢 - 你可以做一個批量提取,而不是。試試這個:

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

(請注意,你甚至不需要保護條款 - 0實體db.get方法短路appropritely)

有什麼區別,你可能會問?那麼,db.get大約需要20-40ms。另一方面,查詢(GQL與否)大約需要160-200毫秒。但是等等,情況變得更糟! IN運算符用Python實現,並轉換爲多個查詢,這些查詢是串行執行的。因此,如果您使用IN過濾器爲10個鍵執行查詢,則需要執行10個獨立的160ms-ish查詢操作,總共需要大約1.6秒的延遲時間。相比之下,一個db.get會產生相同的效果,總共需要大約30ms。

+0

真是個好回答......今晚我會實施這個。我得到了代碼工作(是的!),所以優化可以晚些時候。 :)現在我在正則表達式上。敲打。頭。上。鍵盤。 – 2009-06-17 23:27:23

0

+1給亞當讓我走上正軌。基於他的指針,並在代碼搜索中進行搜索,我有以下解決方案。

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) 
相關問題