Как выполнить запрос в 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)