0
class MyEntity(db.Model):
    timestamp = db.DateTimeProperty()
    title = db.StringProperty()
    number = db.FloatProperty()

db.GqlQuery("SELECT * FROM MyEntity WHERE title = 'mystring' AND timestamp >= date('2012-01-01') AND timestamp <= date('2012-12-31') ORDER BY timestamp DESC").fetch(1000)

これにより、App Engine で最大 600 個のエンティティが取得されます。私の開発サーバーでは期待どおりに動作し、index.yaml をビルドし、それをアップロードしてサーバーでテストしますが、アプリ エンジンでは何も返されません。

Index:
- kind: MyEntity
  properties:
  - name: title
  - name: timestamp
    direction: desc

データストア ビューアでクエリを分割して、問題がどこにあるかを確認し、タイムスタンプの制約が期待どおりに機能することを確認しました。WHERE title = 'mystring'一連のエンティティを返す必要がある場合、クエリは何も返しません。

プロパティと演算子の間のスペースで呼び出さなければならない面倒なフィルタリングを漠然と覚えていますが.filter("prop =",propValue)、これはGqlQueryであるため、そうではありません(GQLでもその形式を試しました)。

私の問題が何か知っている人はいますか?

考えられることの 1 つは、開発サーバーで新しいインデックスを作成してアップロードする前に、BulkLoader.py を介して MyEntity エンティティのリストをアプリに追加したことです。それは違いを生むでしょうか?

4

2 に答える 2

0

あなたが書いた最後の行はおそらく問題です。

実際の実際のデータストアのエンティティには、クエリに必要なインデックスがありません。

私の知る限り、新しいインデックスを追加すると、AppEngineがインデックスを再構築することになっています。これには時間がかかる場合があります。管理ページをチェックして、インデックスの状態をチェックし、それがまだ構築されているかどうかを確認できます。

于 2012-07-23T02:30:29.900 に答える
0

App Engine SDK で提供されるバルクローダーにわずかなバグがあることが判明しました。基本的に、自動生成された構成は文字列を として変換しますdb.Text。これは、これらのフィールドにインデックスを付けたい場合には適していません。正しい import_transform ディレクティブは次のようになります。

transform.none_if_empty(str)

これにより、アップロードされたフィールドを としてインデックスに登録するよう App Engine に指示しますdb.StringProperty()

于 2012-08-20T14:12:49.263 に答える