2015-12-15 87 views
0

我的資源類模型如下:Where子句中谷歌App Engine數據存儲

class Resource(ndb.Model): 
    name = ndb.StringProperty() 
    availability = ndb.StructuredProperty(Availability, repeated=True) 
    tags = ndb.StringProperty(repeated=True) 
    owner = ndb.StringProperty() 
    id = ndb.StringProperty(indexed=True, required=True) 
    lastReservedTime = ndb.DateTimeProperty(auto_now_add=False) 
    startString = ndb.StringProperty() 
    endString = ndb.StringProperty() 

我想提取的記錄這裏的主人是等於某個字符串。 我試過了下面的查詢。它不會給出錯誤,但不會返回任何結果。

Resource.query(Resource.owner== '[email protected]').fetch() 

按我的理解,如果一個列有重複值不應該被索引,這就是爲什麼老闆不被索引。如果我錯了,請糾正我。

有人可以幫我弄清楚如何實現where子句的一種功能?

任何幫助表示讚賞!謝謝!

+0

你確定你有'Resource'實體的所有者屬性等於''abc @ xyz.com'嗎?據我所知,這看起來對我來說是正確的。 – mgilson

+0

@mgilson:嘿!是的,我確信有記錄應該與價值相匹配。實際上,我的數據存儲區中的唯一記錄是擁有此所有者的記錄,當我從DS中提取所有記錄(如select *語句)時,我能夠正確檢索所有記錄。 – ss7389

+0

嘗試'Resource.gql(「WHERE owner =:1」,'[email protected]')。fetch()' –

回答

2

剛試過這個。它第一次工作。要麼你沒有擁有「[email protected]」所有者的資源實體,要麼在實體投入時沒有對所有者屬性編制索引(如果在實體投入時索引= False,則可能發生)。

我的測試:

Resource(id='1', owner='[email protected]').put() 
Resource(id='2', owner='[email protected]').put() 
resources = Resource.query(Resource.owner == '[email protected]').fetch() 
assert len(resources) == 2 

而且,您的評論:

按我的理解,如果一個列有重複值豈不 應該被索引,這就是爲什麼老闆不被索引。請糾正我,如果 我錯了。

你錯了!首先,在數據存儲模型中沒有「列」的概念,所以我會假定你的意思是'Property'。

接下來,明確你的意思是「如果 酒店有重複值」:

  • 我假設你的意思是「來自同一個模型創建具有相同值的特定屬性的多個實體',你的情況'擁有者'。這對索引沒有影響,每個實體將按預期編制索引。
  • 也許你的意思是「一個具有允許多個值(即列表)的屬性的單個實體」,這也不會阻止索引。在這種情況下,實體將被多次索引,列表中的每個項目都會被索引一次。

爲了進一步詳細描述,大部分屬性(即接受基本類型,如字符串,整數,浮點等的)會自動除非你的屬性indexed=False添加到屬性構造索引。實際上,唯一一次你真的需要擔心索引的時候,你需要執行更復雜的查詢,包括查詢更多的屬性(即使這樣,默認情況下,應用引擎開發服務器會自動創建索引你在你的本地index.yaml文件中),或者使用不等式過濾器。

readthedocs瞭解更多詳情。

希望這會有所幫助!