GAE(google app engine) インデックスのトラブルの顛末
GoogleAppEngineの開発していたところ、ローカルの開発環境でも問題ないのですが、 GAEにアップロードして作動させるとうまく動かないことがありました。 調べてみると、GQLクエリ部分で問題が発生しているようです。 いろいろ調べたり、グーグルグループで質問したりしてなんとか解消できたので、 解消方法をメモしておきます。
基本的認識
- ローカルの開発環境でうまく作動していても、サーバ上でうまく作動するとは限らない。→GQLクエリ関係
- index.yaml が意図通り作成されていない場合は、手動で作成する必要がある → # AUTOGENERATE 行は削除する
GQLで条件問い合わせを行う場合は、インデックスが正しく作成されている必要があります。 自動で生成される index.yaml がこちらの意図通りになっていない場合があるので、 手動で index.yaml を書き直す必要があります。 (どういう場合に自動でうまくいくのか、といったことはよくわかっていません。)
対処方法
状況の確認
- 管理コンソールのDataStore - indexes で自分が必要としているインデックスが作成されているか、statusがerrorまたはbuildingになっていないかを確認
- buildingの場合はServingに変わるのをしばらく待つ→いつまで経ってもServingにならない場合は error 同様の手順でインデックスを作成しなおす
ちなみに、
管理コンソールから直接GQLクエリを発行できるので、
自分の意図した作動をするかどうか確認することができます。
GAE上では、エラーがどこで起きているか確認が難しいので、
GQL回りで発生しているかどうかの切り分けに使えそうです。
解決方法
statusがerrorになっているインデックスを appcfg.py vacuum_indexes を使って削除する。 その後適切に index.yaml を手動設定して、appcfg.py update_indexes を実行する。 このとき、deleting statusのインデックスは作成できないので、 完全に消えたことを管理コンソールで確認してから、update_indexes を実行する必要がある。
- 管理コンソールにアクセスして error または buildingになったまま変化しないインデックスを確認する
- index.yaml 内の記述で 問題のインデックス記述を削除
- appcfg.py vacuum_indexes を実行
- このとき、インデックスを削除していいか、確認プロンプトが出るので、Yで削除
- 管理コンソールで、deleting ステータスになっているか確認
- 管理コンソールで、該当インデックスが完全に削除されるまで待つ
- index.yaml を編集して、必要なインデックスを記述(復活させる)
- appcfg.py update_indexes を実行
- 管理コンソールで、該当のインデックスが building から serving になるのを確認(しばらくかかる場合があります)