我想在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
我不知道發生了什麼錯誤的,因爲我是返回的唯一序列,查詢看起來也像我期望的那樣,並且我可以驗證這些條目是否在數據存儲中。任何幫助表示讚賞。
釘住了我的問題,謝謝。由於我處理的數據是DNA或蛋白質的序列,因此我需要一個超過500個字符的字段。你知道用長文本塊創建索引字段的解決方法嗎? – Sevenless 2012-07-31 20:02:09
您通常會做的是添加另一個名爲seq_hash或seq_id的字段,該字段代表字段的校驗和,然後按該字段進行搜索。如果你打算有很多seq_objs和沒有很多不同的seqs,你甚至可以使用另一個名爲SeqIds的模型,它具有seq和seq_id字段。然後您的第一個查詢將從該模型中獲取所有不同的seq_ids,並且您將使用它們來查詢您的SeqObj模型。另請注意,您當前的模型將從數據存儲中獲取大部分實體。 – 2012-07-31 21:59:22
如果你一直在使用NDB,它會給你一個有用的錯誤信息,而不是一個空的結果:「BadFilterError:無法查詢未索引的屬性序列」。 – 2012-08-01 22:35:52