0

驚いたことに、問題なく多くのクエリを実行した後。私は最初の奇妙なGQLの問題に遭遇しました。

フィードバックと呼ばれるモデルのプロパティは次のとおりです。

content  date    title   type    votes_count     written_by

以下はindex.yamlで設定されています:

- kind: Feedback
  properties:
  - name: type
  - name: date
   direction: desc

日付でソートされたすべてのフィードバックデータを照会すると、すべての結果が返されます。

query = GqlQuery("SELECT __key__ FROM Feedback ORDER BY date DESC")

typeプロパティはtype=db.IntegerProperty(default = 1、required = False、indexed = True)に格納され、整数1のタイプのフィードバックデータが8行あります。

しかし、私が質問したとき:

query = GqlQuery("SELECT __key__ FROM Feedback WHERE type = :1 ORDER BY date DESC", type)

それは私に空の結果を返し続けました。何がうまくいかなかったのですか?

アップデート

def get_keys_by_feedback_type(type_type):
    if type_type == FeedbackCode.ALL:
        query = GqlQuery("SELECT __key__ FROM Feedback ORDER BY date DESC")
    else:
        query = GqlQuery("SELECT __key__ FROM Feedback WHERE type = :1 ORDER BY date DESC", type_type)    
    return query

results = Feedback.get_keys_by_feedback_type(int(feedback_type_filter))
for feedback_key in results:
# iterate the query results

インデックスは次のように機能しています。

Feedback 
type ▲ , date ▼ Serving
4

1 に答える 1

3

そもそもはっきりと説明していなかったのは残念でした。他の誰かが同じ問題に直面した場合に備えて、解決策を共有します。

これの根本的な原因は、AppEngineインデックスに関する知識が不十分だったことが原因でした。以前は、最近の要件が変更されるまでフィルタリングする予定がなかったため、「type」プロパティはインデックスに登録されていませんでした。

したがって、質問からわかるように、プロパティ定義モデルから「type」プロパティにインデックスを付けました。ただし、「type」プロパティは、これから説明されている理由により、インデックス付けされていないままでした。以前はインデックス付けされていなかったプロパティのインデックス付け:

インデックス付けされていないプロパティで作成された既存のレコードがある場合、エンティティ(クラス)定義を変更してプロパティを再度インデックス付けした後でも、そのプロパティはそれらのレコードに対してインデックス付けされないままになります。したがって、これらのレコードは、そのプロパティでフィルタリングするクエリによって返されることはありません。

したがって、解決策は次のようになります。

以前はインデックスが作成されていなかったプロパティをインデックスに登録するには

  1. プロパティコンストラクターでindexed=Trueを設定します。

    class Person(db.Model):
        name = db.StringProperty()
        age = db.IntegerProperty(indexed=True)
    
  2. 各レコードをフェッチします。

  3. 各レコードを入れます。(書き込みを行うには、書き込みの前に、タイムスタンプなどのレコード内の何かを変更する必要がある場合があります。)

ですから、質問からすべてが私のGQLに問題はありませんでした。それはすべて、「type」プロパティがインデックス付けされていないままだったためです。とにかく、いくつかの洞察と提案をしてくれた@AdamCrosslandに感謝します。

于 2012-05-18T12:23:21.003 に答える