2011-11-29 87 views
5

GQL reference名單__key__,鼓勵使用IN關鍵字與值的列表,並從手構建一個關鍵的GQL查詢GQL查詢與鍵

SELECT * FROM MyModel WHERE __key__ = KEY('MyModel', 'my_model_key') 

會成功。然而,使用的代碼,你會期望工作:

SELECT * FROM MyModel WHERE __key__ IN (KEY('MyModel', 'my_model_key1'), 
             KEY('MyModel', 'my_model_key2')) 
在數據存儲瀏覽器

,還有的投訴「無效的GQL查詢字符串。」

格式化這種查詢的正確方法是什麼?

更新:這是不可能與當前的SDK。正如我在我的評論中指出的那樣,當使用列表時,只有引用(例如:1:email)或int,float,string,boolean或null文字是可接受的列表條目。

第二次更新:我修復了這個錯誤,現在可以執行這樣的查詢。您可以在Google Code Hosting diff中找到Fix。

PS我知道有更有效的方式來在Python中完成此操作(無需構建GQL查詢)並使用remote_api,但每次調用remote_api都會違反配額。在配額不是(必然)免費的環境中,快速和骯髒的查詢非常有用。

+0

您是否真的認爲在控制檯中手動獲取的實體數量將增加大量消耗的配額,如果您是通過remote_api實現的? –

+0

不需要。我只是想知道如何正確構建查詢。我的文章中的第二個片段看起來不會是「無效的GQL查詢字符串」。 「WHERE __key__ IN」是否是無效的GQL? – bossylobster

+0

雖然我仍然困惑你爲什麼要這樣做。這是獲取實體的特別低效的方式。 –

回答

1

fix實施後,從原來的職位代碼片段就足夠了:

SELECT * FROM MyModel WHERE __key__ IN (KEY('MyModel', 'my_model_key1'), 
             KEY('MyModel', 'my_model_key2')) 

PS我意識到我的原帖評論可能不如一個答案,未來的觀衆足夠清晰。

2

我不明白。您的目標是在數據存儲查看器中查看實體的特定列表以避免消耗配額?我不知道的方式與GQL做到這一點,但如果你知道你可以直接訪問他們的實體按鍵,例如:

https://appengine.google.com/datastore/edit?app_id=myapp&key=key1

https://appengine.google.com/datastore/edit?app_id=myapp&key=key2

如果你在代碼中這樣做,請不要嘗試使用GQL。使用db.get(keys)或類似的東西。

+0

我沒有使用'db.get'或'MyModel.get_by_key_name'或'MyModel.get_by_id'的問題。希望知道如何做到這一點,這個問題得到了加強。就像我剛纔提到的那樣,甚至可以用SELECT * FROM MyModel WHERE __key__ = KEY('MyModel','my_model_key')來完成單個查詢(就像查詢字符串中的'key ='一樣)。 – bossylobster