2013-10-26 44 views
2

DB模式文件被定義爲這個在db/d.py文件中沒有數據:GAE數據存儲返回使用Python濾波

from google.appengine.ext import db 
class D(db.Model): 
    did = db.StringProperty(required = True) 
    sample_tm = db.DateTimeProperty(auto_now_add = True) 
    weekday = db.IntegerProperty(required = False) 

而且出現了一束插入與此架構中的數據存儲區的數據,我可以在應用程序引擎中查看來自數據存儲區查看器的人員。

但是,當我嘗試使用python查詢處理程序python腳本中的數據時發生問題。

from db import d 
class WaitTimeQuery(webapp2.RequestHandler): 

    def post(self): 
     self.response.headers['Content-Type'] = 'text/html'   
     q = d.D.all() 
     print q.get() 

而每一次它只會打印一個None。爲什麼這些數據不能以這種方式獲取?

另外我試圖使用嵌入GQL在python,它再次返回任何結果,但是在執行時:

SELECT * FROM d

在數據查看器,該結果可以顯示正確地

+1

使用谷歌。appengine.ext.ndb代替db。也使用D.query()。fetch()而不是D.all()。get() –

+0

@RemcoHaszing謝謝你的回覆,儘管它不工作。返回空列表 –

+0

實體是否有祖先?如果是這樣,你需要在查詢函數中指定一個。 'D.query(祖先= my_ancestor_key).fetch()' –

回答

1

首先作爲Remco Haszing說,在編寫新的應用程序時使用ndb而不是db。在編寫遺留應用程序時,可以使用db,但您應該遷移到ndb。 ;-)

required=False也是沒有必要的,這是默認值。 ;-)

from google.appengine.ext import ndb 

class D(ndb.Model): 
    did = ndb.StringProperty(required=True) 
    sample_tm = ndb.DateTimeProperty(auto_now_add=True) 
    weekday = ndb.IntegerProperty() 

創建一個實例,並把它:

d = D(did='spam') 
d_key = d.put() # Stores the instance. 

d_keyKey你可以用它來獲取實例從數據存儲回來。

當你有可能做一個查詢,而不是一個查詢:

d = d_key.get() 
assert d.did == 'spam' 

全球查詢(D.query())的問題是,有沒有保險就會有結果。詳情請參閱the docs

NDB在步驟中寫入數據:

  • 在提交階段,底層數據存儲服務記錄的變化。
  • NDB使其受影響的實體/實體的緩存失效。因此,將來的讀操作將讀取(並緩存)底層數據存儲區,而不是讀取緩存中的過時值。
  • 最後,也許幾秒鐘後,底層數據存儲應用更改。它使更改對全局查詢和最終一致的讀取可見。變化在數據存儲應用

後,您可以使用全局查詢:

results = D.query().fetch() # results will be a list with D instances