Как выполнить запрос в GQL с помощью ключа сущности

Как написать запрос по ключу объекта с помощью GQL в средстве просмотра данных Google App Engine?

В средстве просмотра первый столбец (Id / Name) отображается как name=_1, в подробном представлении он показывает ключ как

Decoded entity key: Programme: name=_1
Entity key: agtzcG9................... 

Этот запрос не работает:

SELECT * FROM Programme where name = '_1'

person Thilo    schedule 04.01.2010    source источник


Ответы (5)


Вы можете использовать ключ объекта, чтобы получить его:

SELECT * FROM Programme where __key__ = KEY('agtzcG9...................')

И вы должны иметь возможность запрашивать, используя имя аналогичным образом:

SELECT * FROM Programme where __key__ = KEY(Programme, '_1')

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

person Adam Crossland    schedule 04.01.2010
comment
Ага, нет. Это огромная трата времени и ресурсов. - person Nick Johnson; 07.01.2010
comment
@Nick: но в консоли администратора, наверное, нет лучшего способа. - person Thilo; 07.01.2010
comment
можно ли запросить по идентификатору вместо ключа? - person tensaix2j; 24.06.2010
comment
Когда вам нужно только знать, существует что-то или нет, выполнение операции подсчета запроса по ключу - самый быстрый способ узнать, существует ли сущность. Если вам нужно получить ключ, вы можете произвести подсчет ключевого запроса, и если ›0, вы уже знаете ключ. Если вам нужна сама сущность, просто сделайте так, как советует ник, и выполните get () для этой сущности. - person Ajax; 03.05.2012
comment
Помните, вам нужно указать идентификатор только в том случае, если это строка. Если это число, не цитируйте его. Итак, если идентификатор был числовым со значением 888, то приведенный выше запрос был бы: SELECT * FROM Program, где key = KEY ('Program', 888) - person Ezward; 03.08.2013
comment
count на самом деле дорогостоящая операция, чтобы увидеть, существует ли сущность, я просто запрашиваю ее, чтобы получить первый результат - person ZiglioUK; 03.03.2014

Для числовых идентификаторов работает форма, аналогичная запросу по имени:

SELECT * from Programme where __key__ = KEY('Programme', 1234567)

Я нашел эту форму особенно полезной в консоли администратора.

person Jeffrey Miller    schedule 02.06.2011

Вам вообще не нужно запрашивать сущность по ключу - вы можете просто получить сущность по ее ключу. В Python это можно сделать с помощью MyModel.get_by_key_name('_1'). Это в 3-5 раз быстрее, чем предложение Адама использовать запрос.

person Nick Johnson    schedule 06.01.2010
comment
Это не было моим предложением, Ник, я просто пытался помочь ему заставить его запрос работать. Я думаю, что он пытается просматривать данные в средстве просмотра данных консоли администратора. - person Adam Crossland; 07.01.2010
comment
@ Nick + Adam: да, я пытался просмотреть некоторые данные в консоли администратора. - person Thilo; 07.01.2010
comment
для записи __key__ запросы обычно читают непосредственно из самой таблицы сущностей, а не сначала индексы, а затем таблицу сущностей. поэтому на практике, когда хранилище данных компилирует этот запрос в необработанный поиск или сканирование в большой таблице, нет большой разницы между запросом __key__ == и get(). конечно, это деталь реализации. по-прежнему хорошей практикой является использование get() всякий раз, когда вы ищете отдельную сущность. - person ryan; 26.01.2011
comment
Райан, __key__ запросы никогда, никогда не читаются из таблицы сущностей. Они читают из индексных таблиц, которые включают все таблицы, кроме таблицы сущностей; все индексные таблицы указывают на ключ, поэтому, какой бы индекс вы ни использовали для поиска, именно отсюда и берется ваш ключ. В 1.6.5 есть проекционные запросы для фактического чтения ключа и совпадающих данных индекса по той же цене, что и запрос ключей ... ... А именно, что вам никогда не нужно ставить конкуренцию в таблицу сущностей. - person Ajax; 03.05.2012
comment
@Ajax Скрещенные провода. Райан говорит о запросах вида SELECT * FROM Kind WHERE key =: 1; вы говорите о запросах формы SELECT key FROM Kind .... Вы оба правы насчет ваших соответствующих типов запросов. - person Nick Johnson; 04.05.2012

При запросе по ключу вам необходимо точно сопоставить ключ, включая родительский, а не только идентификатор или имя. Конечно, если родительский элемент имеет значение NULL, как в приведенном выше примере, идентификатора или имени и типа объекта будет достаточно.

Если у вас уже есть закодированный ключ объекта, вы можете просто использовать его, например:

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.

Похоже, что нет способа выбрать все с одним и тем же идентификатором или именем, независимо от родителя.

person aij    schedule 02.07.2014

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

Например, для типа mytype с идентификатором / именем 12345 это НЕ работает:

SELECT * FROM mytype WHERE __key__ = KEY('mytype', '12345')

Но это действительно так:

SELECT * FROM mytype WHERE __key__ = KEY(mytype, 12345)
person Tim Consolazio    schedule 15.05.2015