2012-07-31 39 views
1

我想在App Engine上構建一個Web應用程序,在某個時候,我需要一個函數來構建一個列表屬性與不同組中的一個成員。我可以,如果我使用SQLite數據庫和數據庫web.py模塊maniputate得到這個工作,我可以實現我所需要的是這樣的:谷歌應用引擎返回空查詢

db = web.database(dbn='sqlite',db=':memory:') 
db.query("CREATE TABLE seq_list (seq TEXT, seq_pickle TEXT);") 

# do some stuff to the database 

def getUnique(): 
    uniq_entries = db.query("SELECT DISTINCT seq FROM seq_list;") 
    if not uniq_sequences: 
     for entry in uniq_entries: 
      seq_query = db.query("SELECT * FROM seq_list WHERE seq='" + str(entry.seq) +"';") 
      seq_obj = pickle.loads(seq_query[0].seq_pickle) 
      self.uniq_sequences.append(seq_obj) 

我無法得到這個應用程序中工作發動機雖然。

class SeqObj(db.Model): 
    seq = db.TextProperty(required = True) 
    seq_pickle = db.TextProperty(required = True) 

# do some stuff to the database 

def getUnique(): 
    entries = db.GqlQuery("SELECT * FROM SeqObj") 
    entries = list(entries) 
    if not uniq_sequences: 
     unique_entries = set([entry.seq for entry in entries]) 

     # this prints the unique entries correctly 
     print unique_entries 

     for entry in unique_entries: 
      try: 
       q = "SELECT * FROM SeqObj WHERE seq='%s'"% entry 
       print q 
       seq_query = db.GqlQuery(q) 

       # these are the lines that break it 
       seq_obj = pickle.loads(seq_query[0].seq_pickle) 
       uniq_sequences.append(seq_obj) 
       print entry 
      except: 
       pass 

try/except用於顯示打印語句。這對於輸出一些測試數據:

set([u'DXTMT', u'DIXTX', u'XSXDV', u'XI*MT']) 
SELECT * FROM SeqObj WHERE seq='DXTMT' 
SELECT * FROM SeqObj WHERE seq='DIXTX' 
SELECT * FROM SeqObj WHERE seq='XSXDV' 
SELECT * FROM SeqObj WHERE seq='XI*MT' 

當我不把一切都在try catch塊,我得到

IndexError: The query returned fewer than 1 results 

我不知道發生了什麼錯誤的,因爲我是返回的唯一序列,查詢看起來也像我期望的那樣,並且我可以驗證這些條目是否在數據存儲中。任何幫助表示讚賞。

回答

4

問題是你不能過濾未索引的屬性(TextProperty是未索引的)。詳情請參閱https://developers.google.com/appengine/docs/python/datastore/queries#Filtering_on_Unindexed_Properties_Returns_No_Results

如果您的seq字段已知少於500個字符,請嘗試使用StringProperty。

同樣在這些情況下,我總是建議先在DataStore查看器中運行查詢。它建議您需要運行所需查詢的索引。

+0

釘住了我的問題,謝謝。由於我處理的數據是DNA或蛋白質的序列,因此我需要一個超過500個字符的字段。你知道用長文本塊創建索引字段的解決方法嗎? – Sevenless 2012-07-31 20:02:09

+0

您通常會做的是添加另一個名爲seq_hash或seq_id的字段,該字段代表字段的校驗和,然後按該字段進行搜索。如果你打算有很多seq_objs和沒有很多不同的seqs,你甚至可以使用另一個名爲SeqIds的模型,它具有seq和seq_id字段。然後您的第一個查詢將從該模型中獲取所有不同的seq_ids,並且您將使用它們來查詢您的SeqObj模型。另請注意,您當前的模型將從數據存儲中獲取大部分實體。 – 2012-07-31 21:59:22

+0

如果你一直在使用NDB,它會給你一個有用的錯誤信息,而不是一個空的結果:「BadFilterError:無法查詢未索引的屬性序列」。 – 2012-08-01 22:35:52

0

這是在dev_appserver上還是在真正的應用程序引擎服務器上失敗?

如果它適用於dev_appserver而不是真實的東西,那麼我想你可能會錯過真正的服務器上的一些索引。