我正在尝试在App Engine上构建一个Web应用程序,在某个时刻,我需要一个函数来构建一个列表属性,其中包含来自不同组的一个成员。如果我使用Sqlite数据库和web.py数据库模块进行操作,我能够正常工作,我可以实现我需要的东西:
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)
我无法在App引擎中使用它。
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用于显示print语句。这输出了一些测试数据:
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
我不知道出了什么问题,因为我返回了唯一的序列,查询看起来也像我期望的那样,我可以验证条目是否在数据存储区中。任何帮助表示赞赏。
答案 0 :(得分:4)
问题是您无法过滤未编制索引的属性(TextProperty未编入索引)。有关详细信息,请参阅https://developers.google.com/appengine/docs/python/datastore/queries#Filtering_on_Unindexed_Properties_Returns_No_Results。
如果已知seq
字段少于500个字符,请尝试使用StringProperty。
同样在这些情况下,我总是建议首先在DataStore查看器中运行查询。它建议您运行所需查询所需的索引。
答案 1 :(得分:0)
这是在dev_appserver或真正的应用引擎服务器上失败吗?
如果它适用于dev_appserver但不适用于真实的东西,那么我猜你可能会遗漏真实服务器上的一些索引。