2010-01-04 36 views
69

如何在Google App Engine數據查看器中使用GQL編寫針對實體鍵的查詢?如何使用實體鍵在GQL中查詢

在觀衆中,第一列(ID /名稱)顯示爲name=_1,在詳細查看顯示鍵

Decoded entity key: Programme: name=_1 
Entity key: agtzcG9................... 

該查詢不起作用:

SELECT * FROM Programme where name = '_1' 

回答

103

你可以使用實體的密鑰來檢索它:

SELECT * FROM Programme where __key__ = KEY('agtzcG9...................') 

而且,您應該能夠查詢使用同樣的名稱:

SELECT * FROM Programme where __key__ = KEY(Programme, '_1') 

請注意,這不是您想要在AppEngine應用程序中執行的操作;正如尼克在評論中所指出的那樣,這是對時間的巨大浪費。真的,這個例子只是向你展示如何在管理控制檯中通過Key進行查詢。

+4

哎呀,沒有。這大大浪費了時間和資源。 – 2010-01-06 21:37:25

+4

@Nick:但在管理控制檯中,可能沒有更好的方法。 – Thilo 2010-01-07 00:01:09

+0

對不起,我的錯。 :/ – 2010-01-11 11:03:40

18

您不需要通過鍵查詢來獲取實體 - 您可以簡單地通過其鍵獲取實體。在Python中,你可以用MyModel.get_by_key_name('_1')來做到這一點。這比Adam使用查詢的建議快3到5倍。

+5

這不是我的建議,尼克,我只是想幫助他使他的查詢工作。我認爲他試圖在管理控制檯數據查看器中查看內容。 – 2010-01-06 23:34:58

+0

@ Nick + Adam:是的,我試圖在管理控制檯中查看一些數據。 – Thilo 2010-01-07 00:00:32

+1

作爲記錄,'__key__'查詢實際上通常直接從實體表本身讀取,而不是索引,然後是實體表。所以在實踐中,當數據存儲將這個查詢編譯成rawtable查找或掃描時,'__key__ =='查詢與'get()'之間沒有太大區別。 當然,這是一個實現細節。每當您查找單個實體時,使用'get()'仍然是一個好習慣。 – ryan 2011-01-25 23:30:16

20

對於數字ID,類似於查詢通過名稱表的工作方式:

SELECT * from Programme where __key__ = KEY('Programme', 1234567) 

我發現這種形式在管理控制檯中尤其有用。

2

按鍵查詢時,您需要準確地匹配鍵,包括父級,而不僅僅是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或名稱的所有內容,而不考慮父項。

1

只是一個簡短的提示:當我在KEY中的任何參數周圍使用任何引號時,調用失敗(在管理控制檯中出現錯誤彈出窗口)。

例如,鍵入 「MYTYPE」 與ID /名稱12345,這確實不工作

SELECT * FROM mytype WHERE __key__ = KEY('mytype', '12345') 

但這:

SELECT * FROM mytype WHERE __key__ = KEY(mytype, 12345)