App Engine で Web アプリを構築しようとしていますが、特定の時点で、個別のグループの 1 つのメンバーでリスト プロパティを作成する関数が必要です。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 Engineで機能させるのに問題があります。
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
一意のシーケンスが返され、クエリも期待どおりに表示され、エントリがデータストアにあることを確認できるため、何が問題なのかわかりません。どんな助けでも大歓迎です。