GoogleのAppEngineインデックスに問題があります。 GoogleAppEngineLauncherを介してアプリを実行すると、アプリは正常に動作しています。アプリをデプロイすると、次のエラーが発生します。
NeedIndexError: no matching index found.
The suggested index for this query is:
- kind: Bar
ancestor: yes
properties:
- name: rating
direction: desc
このコード行の後にエラーが生成されます。
bars = bar_query.fetch(10)
上記のコード行の前に、次のように表示されます。
bar_query = Bar.query(ancestor=guestbook_key(guestbook_name)).order(-Bar.rating)
私のindex.yamlファイルには、以下の正確な「推奨」インデックスが含まれています#AUTOGENERATED:
- kind: Bar
ancestor: yes
properties:
- name: rating
direction: desc
私は多分何かが足りないのですか? index.yamlファイルを削除し、(コマンドラインを介して)アプリを再度デプロイすると、アップロードされたファイルが1つ少なくなりました。つまり、index.yamlファイルがそこにあります。
すべてがローカルで正常に機能しています。私は最新のMacOSxに取り組んでいます。展開に使用されたコマンドは次のとおりです。
appcfg.py -A app-name --oauth2 update app
私が実装したデータストアは、ゲストブックチュートリアルアプリに大まかに基づいています。
どんな助けでも大歓迎です。
編集:
私のndb.Modelは次のように定義されています。
class Bar(ndb.Model):
content = ndb.StringProperty(indexed=False)
lat = ndb.FloatProperty(indexed=False)
lon = ndb.FloatProperty(indexed=False)
rating = ndb.IntegerProperty(indexed=True)
url = ndb.TextProperty(indexed=False)
https://appengine.google.com/datastore/indexes をチェックして、このインデックスが存在し、ステータスが「serving」に設定されているかどうかを確認します。インデックスがまだ作成されている可能性があります。
開発環境は本番環境をエミュレートします。データストアの意味でのインデックスは実際にはありません。
おそらく今は少し遅れていますが、deployを単独で実行するとindex.yamlファイルが無視されるため、「gcloud appdeployindex.yaml」を実行すると役に立ちました。
他の人が言っているように、 https://appengine.google.com/datastore/indexes のダッシュボードにはしばらくの間「保留中」と表示されます。
私は同じ問題に出くわしました、そしてあなたのコメントは私を正しい方向に助けました。これを処理する方法についてGoogleが言っていることは次のとおりです。
Googleのドキュメントによると、ストーリーは
gcloud app deploy
index.yamlファイルはアップロードされません(質問はなぜですか?)。とにかく、このインデックスファイルを手動でアップロードする必要があります。
そのために、ドキュメントには次のコマンドが記載されています。
gcloud datastore create-indexes index.yaml
(index.yamlファイルの同じディレクトリからこれを実行すると仮定します)これを実行すると、データストアコンソールに移動して、インデックスが作成されたことがわかります。その後、インデックス作成が開始され(私の場合、約5分かかりました)、インデックスが提供されたら、アプリケーションを開始できます。
「index.yaml」ファイルの自動生成行の上にエラーが表示されているインデックスを移動することで、この問題を修正しました。
あなたの場合、yamlファイルは次のようになります。
indexes:
- kind: Bar
ancestor: yes
properties:
- name: rating
direction: desc
# AUTOGENERATED
次に、アプリを更新してからインデックスを更新するだけです。次のコマンドを実行してインデックスを更新します。
appcfg.py [options] update_indexes <directory>
ディレクトリはindex.yamlファイルに関連するディレクトリです。ダッシュボードの https://appengine.google.com/datastore/indexes にそのインデックスが表示されます。
更新は最初は「保留中」になりますが、インデックスに「提供中」と表示された後、クエリを実行できるようになります。
このNeedIndexError
は、少し異なる問題を抱えてここに到着したため、さまざまな原因でトリガーされる可能性があるため、実行できることを示すために、間違ったことをすべて説明しようと思います。
エンティティの種類ごとに1つのインデックスだけが必要だと思いました。 I found必要なさまざまなクエリと同じ数のインデックスが必要である限り、それは真実ではありません。
development web server
にある間、インデックスは自動生成され、#AUTOGENERATED
ファイルのindex.yaml
行の下に配置されます。
インデックスを変更した後、最初にgcloud datastore indexes create index.yaml
を使用し、インデックスがhttps://console.cloud.google.com/datastore/indexes?project=your-project
でServing
になるまでwaitします。
gcloud datastore indexes cleanup index.yaml
を実行して未使用のインデックスをクリーンアップします。本番環境で使用されているインデックスは削除しないことに注意してください。参照 ここ
インデックスプロパティでdirection
を指定しない場合、デフォルトではASC
になることに注意してください。したがって、-
ソートクエリを作成しようとすると、再びエラーが発生します。
私が思うことですが、私の特定の問題よりも100%長い証拠はありませんが、一種のブレーンストーミングとして役立つと思います:
私の場合、以下のようにインデックスファイルを手動でアップロードしました。
gcloud datastore indexes create "C:\Path\of\your\project\index.yaml"
次に、更新を確認する必要があります。
Configurations to update:
descriptor: [C:\Path\of\your\project\index.yaml]
type: [datastore indexes]
target project: [project_name]
Do you want to continue (Y/n)? y
次に、データストアコンソールに移動して、次のリンクからインデックスが作成されているかどうかを確認できます: https://console.cloud.google.com/datastore/indexes