Как выполнить запрос в GQL с помощью ключа сущности
Как написать запрос против ключа сущности с помощью GQL в Google App Engine Data Viewer?
В средстве просмотра первый столбец (Id/Name) отображается как name=_1
, в подробном представлении он показывает ключ как
Decoded entity key: Programme: name=_1
Entity key: agtzcG9...................
Этот запрос не работает:
SELECT * FROM Programme where name = '_1'
Ответы
Ответ 1
Вы можете использовать ключ сущности для его получения:
SELECT * FROM Programme where __key__ = KEY('agtzcG9...................')
И вы должны иметь возможность запросить имя с аналогичным именем:
SELECT * FROM Programme where __key__ = KEY(Programme, '_1')
Обратите внимание, что это не то, что вы хотели бы сделать в своем приложении AppEngine; как отмечает Ник в своем комментарии, это огромная трата времени. Действительно, этот пример полезен только для того, чтобы показать вам, как запросить ключ в консоли администратора.
Ответ 2
Для числовых идентификаторов работает форма, похожая на запрос по имени:
SELECT * from Programme where __key__ = KEY('Programme', 1234567)
Я нашел эту форму особенно полезной в консоли администратора.
Ответ 3
Вам не нужно запрашивать, чтобы получить сущность по ключу вообще - вы можете просто получить объект по его ключу. В Python вы можете сделать это с помощью MyModel.get_by_key_name('_1')
. Это в 3-5 раз быстрее, чем предложение Адама по использованию запроса.
Ответ 4
При запросе по ключу нужно точно указать ключ, включая родителя, а не только идентификатор или имя. Разумеется, если родительский объект имеет значение null, как в приведенном выше примере, достаточно ID или Name и тип объекта.
Если у вас уже закодированный ключ сущности, вы можете просто использовать его как:
SELECT * FROM Programme where __key__ = KEY('agtzcG9...................')
Для простого примера выше,
SELECT * FROM Programme where __key__ = KEY('Programme', '_1')
но если ваш ключ имеет родителя, например
Paren: id=123
Тогда запрос будет
SELECT * FROM Programme where __key__ = KEY('Paren', 123, 'Programme', '_1')
Если у родителя есть родительский элемент, вам тоже нужно добавить его. Для получения дополнительной информации см. Официальную документацию GQL .
Кажется, что нет способа выбрать все с одинаковым идентификатором или именем независимо от родителя.
Ответ 5
Просто короткое замечание: когда я использую любые кавычки вокруг любого из аргументов в KEY, вызов завершается неудачно (в консоли администратора я получаю всплывающее сообщение об ошибке).
Например, для типа "mytype" с ID/Name 12345 это работает NOT:
SELECT * FROM mytype WHERE __key__ = KEY('mytype', '12345')
Но это делает:
SELECT * FROM mytype WHERE __key__ = KEY(mytype, 12345)