如何在Google App Engine數據查看器中使用GQL編寫針對實體鍵的查詢?如何使用實體鍵在GQL中查詢
在觀衆中,第一列(ID /名稱)顯示爲name=_1
,在詳細查看顯示鍵
Decoded entity key: Programme: name=_1
Entity key: agtzcG9...................
該查詢不起作用:
SELECT * FROM Programme where name = '_1'
如何在Google App Engine數據查看器中使用GQL編寫針對實體鍵的查詢?如何使用實體鍵在GQL中查詢
在觀衆中,第一列(ID /名稱)顯示爲name=_1
,在詳細查看顯示鍵
Decoded entity key: Programme: name=_1
Entity key: agtzcG9...................
該查詢不起作用:
SELECT * FROM Programme where name = '_1'
你可以使用實體的密鑰來檢索它:
SELECT * FROM Programme where __key__ = KEY('agtzcG9...................')
而且,您應該能夠查詢使用同樣的名稱:
SELECT * FROM Programme where __key__ = KEY(Programme, '_1')
請注意,這不是您想要在AppEngine應用程序中執行的操作;正如尼克在評論中所指出的那樣,這是對時間的巨大浪費。真的,這個例子只是向你展示如何在管理控制檯中通過Key進行查詢。
您不需要通過鍵查詢來獲取實體 - 您可以簡單地通過其鍵獲取實體。在Python中,你可以用MyModel.get_by_key_name('_1')
來做到這一點。這比Adam使用查詢的建議快3到5倍。
這不是我的建議,尼克,我只是想幫助他使他的查詢工作。我認爲他試圖在管理控制檯數據查看器中查看內容。 – 2010-01-06 23:34:58
@ Nick + Adam:是的,我試圖在管理控制檯中查看一些數據。 – Thilo 2010-01-07 00:00:32
作爲記錄,'__key__'查詢實際上通常直接從實體表本身讀取,而不是索引,然後是實體表。所以在實踐中,當數據存儲將這個查詢編譯成rawtable查找或掃描時,'__key__ =='查詢與'get()'之間沒有太大區別。 當然,這是一個實現細節。每當您查找單個實體時,使用'get()'仍然是一個好習慣。 – ryan 2011-01-25 23:30:16
對於數字ID,類似於查詢通過名稱表的工作方式:
SELECT * from Programme where __key__ = KEY('Programme', 1234567)
我發現這種形式在管理控制檯中尤其有用。
按鍵查詢時,您需要準確地匹配鍵,包括父級,而不僅僅是ID或名稱。當然,如果父項爲空,就像上面的例子那樣,ID或名稱以及實體的類型就足夠了。
如果您有已編碼的實體按鍵,你可以使用這樣的:
SELECT * FROM Programme where __key__ = KEY('agtzcG9...................')
對於上面的簡單的例子,
SELECT * FROM Programme where __key__ = KEY('Programme', '_1')
會做,但如果你的鑰匙有父像
Paren: id=123
那麼查詢將
SELECT * FROM Programme where __key__ = KEY('Paren', 123, 'Programme', '_1')
如果父母本身有父母,您也需要添加。欲瞭解更多詳情,請參閱official GQL documentation。
似乎沒有辦法選擇具有相同ID或名稱的所有內容,而不考慮父項。
只是一個簡短的提示:當我在KEY中的任何參數周圍使用任何引號時,調用失敗(在管理控制檯中出現錯誤彈出窗口)。
例如,鍵入 「MYTYPE」 與ID /名稱12345,這確實不工作:
SELECT * FROM mytype WHERE __key__ = KEY('mytype', '12345')
但這:
SELECT * FROM mytype WHERE __key__ = KEY(mytype, 12345)
哎呀,沒有。這大大浪費了時間和資源。 – 2010-01-06 21:37:25
@Nick:但在管理控制檯中,可能沒有更好的方法。 – Thilo 2010-01-07 00:01:09
對不起,我的錯。 :/ – 2010-01-11 11:03:40