Ошибка Google App Engine: NeedIndexError: найден соответствующий индекс соответствия
У меня возникают проблемы с индексами Google App Engine. При запуске моего приложения через приложение 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 и снова развернул приложение (через командную строку), и один файл был загружен, поэтому файл index.yaml существует.
Все работает нормально локально. Я работаю над последним Mac OSx. Команда, используемая для развертывания, была следующей:
appcfg.py -A app-name --oauth2 update app
Реализовано хранилище, основанное на учебном приложении гостевой книги.
Любая помощь будет принята с благодарностью.
EDIT:
My 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)
Ответы
Ответ 1
Отметьте https://appengine.google.com/datastore/indexes, чтобы увидеть, присутствует ли этот индекс, и статус установлен на "обслуживание". Возможно, что индекс все еще строится.
Среда разработки эмулирует производственную среду. На самом деле это не имеет индексов в смысле Datastore.
Ответ 2
Вероятно, немного поздно, но запуск "gcloud app deploy index.yaml" помог с момента запуска развертывания сам проигнорировал файл index.yaml.
Как говорили другие, панель управления https://appengine.google.com/datastore/indexes покажет "ожидающий" время.
Ответ 3
Я наткнулся на ту же проблему, и ваши комментарии помогли мне в правильном направлении. Здесь Google говорит, как с этим справиться:
Согласно документации Google, история состоит в том, что использование
gcloud app deploy
файл index.yaml не загружается (вопрос почему?). В любом случае, нужно загрузить этот файл индекса вручную.
Для этого в документации приведена следующая команда:
gcloud datastore create-indexes index.yaml
(предположим, что вы выполните это из того же каталога файла index.yaml)
Как только вы это сделаете, вы можете перейти на консоль Datastore, и вы увидите, что индекс был создан. Затем он начнет индексироваться (занял около 5 минут в моем случае), и как только индекс будет обслуживаться, вы можете запустить свое приложение.
Ответ 4
Я исправил эту проблему, перемещая индекс, который, по словам ошибки, отсутствует над строкой автоматического генерации в файле 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
Первоначально обновление будет "ожидающим", но после того, как в индексе указывается "обслуживание", вы сможете сделать свой запрос.
Ответ 5
В моем случае я загрузил индексный файл вручную, как показано ниже:
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.