1

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

一意のシーケンスが返され、クエリも期待どおりに表示され、エントリがデータストアにあることを確認できるため、何が問題なのかわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

4

問題は、インデックスのないプロパティをフィルター処理できないことです (TextProperty はインデックスがありません)。詳細については、 https://developers.google.com/appengine/docs/python/datastore/queries#Filtering_on_Unindexed_Properties_Returns_No_Resultsを参照してください。

seqフィールドが 500 文字未満であることがわかっている場合は、代わりに StringProperty を使用してみてください。

また、このような場合は、最初に DataStore ビューアでクエリを実行することを常にお勧めします。目的のクエリを実行するために必要なインデックスが提案されます。

于 2012-07-31T18:37:50.877 に答える
0

これは dev_appserver または実際のアプリ エンジン サーバーで失敗していますか?

dev_appserver では機能するが、実際のサーバーでは機能しない場合は、実際のサーバーでいくつかのインデックスが欠落している可能性があると思います。

于 2012-07-31T18:39:41.550 に答える