Когда мне нужен индекс для хранилища данных Google App Engine?

Я использую стандартную среду Google App enginge Python 2.7 со старым хранилищем данных (не NDB) для своего проекта.

Я столкнулся со странным поведением пользовательского индекса хранилища данных.

У меня есть такая модель.

class EmailHistory(db.Model):
    code = db.StringProperty(required=True)
    account = db.ReferenceProperty(Account)
    group = db.ReferenceProperty(Group)
    ......

И я попытался получить объекты, используя запрос ниже.

q = EmailHistory.all().filter('account =', account).filter('code =', code).filter('group =', group)
lst = [e for e in q]

Я ожидал, что мне понадобится пользовательский индекс для этого запроса, так как я запрашиваю по трем свойствам. (Насколько я понимаю, AppEngine автоматически создает встроенный индекс для каждого свойства, поэтому мне не нужно определять индекс для запроса одного свойства. Но если я хочу выполнить запрос по нескольким свойствам, мне нужно будет определить собственный индекс)

Но когда я запускаю его локально, он не создает пользовательский индекс автоматически. Более того, когда я запускал его на сервере Google App Engine, я мог получать сущности без NeedIndexError.

Мой вопрос: когда Datatstore нужен пользовательский индекс? Я прочитал их официальную документацию, но не понял, почему мне не нужен пользовательский индекс для запроса выше. https://cloud.google.com/appengine/docs/standard/python/datastore/indexes

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Cloud Datastore может выполнять запросы, в которых можно использовать объединение слиянием. Более подробную информацию можно найти на странице https://cloud.google.com/appengine/articles/indexselection .

В https://cloud.google.com/appengine/docs/standard/python/datastore/indexes#index-configuration говорится: «Эти предопределенные индексы достаточны для выполнения многих простых запросов, таких как запросы только на равенство и простые запросы на неравенство». Ваш запрос является запросом только на равенство.

Другие вопросы по теме