データストアのインデックスの設定
インデックスの作成
インデックスを定義せずに、以下のようなクエリを実行しました。
db.GqlQuery("SELECT * FROM ExModel WHERE data1='XXX' ORDER BY data2, data3")
そうすると、以下のようなエラーが出力されました。
no matching index found. This query needs this index: - kind: ExModel properties: - name: data1 - name: data2 - name: data3 … NeedIndexError: no matching index found. This query needs this index: - kind: ExModel properties: - name: data1 - name: data2 - name: data3
単純なクエリ用のインデックス(単一のプロパティ上のクエリなど)は自動で作成されますが、複雑なクエリに対してはインデックスを index.yaml という名前の設定ファイルで定義する必要があるそうです。
index.yaml の例です。内容はエラーで出力されたままを記述すればOKです。
indexes: - kind: ExModel properties: - name: data1 - name: data2 - name: data3 direction: asc
Google app engine にアップロードし、管理コンソールの「Datastore Indexes」を確認します。「Status」が「Building」→「Serving」になれば作成完了です。
大量のデータを扱っている場合はインデックスの作成に時間がかかる場合があります。
インデックスの更新
appcfg.py update_indexes
インデックスの削除
appcfg.py vacuum_indexes
「Status」が「Deleting」になり、一覧に表示されなくなれば削除完了です。
こちらの URL を参考にさせていただきました。
- http://code.google.com/intl/ja/appengine/docs/python/config/indexconfig.html
- http://code.google.com/intl/ja/appengine/docs/python/tools/uploadinganapp.html
- Google App Engineで、"NeedIndexError: no matching index found."というエラーがでたときの対処法 - 勉強したことのまとめ
- 技術メモ: インデックスが必要です no matching index found. This query needs this index