2010-11-01 2 views
0

У меня есть простой вопрос:GQL Синтаксис состояние

В GQL syntax summary

<condition> := <property> {< | <= | > | >= | = | != } <value> 

, но в example here

if users.get_current_user(): 
    user_pets = db.GqlQuery("SELECT * FROM Pet WHERE owner = :1", 
          users.get_current_user()) 

Что такое :1?

В соответствии с синтаксисом там должно быть :=.

Спасибо.

ответ

5

Грамматика GQL по ссылке синтаксической вы публикуемую это:

SELECT [* | __key__] FROM <kind> 
    [WHERE <condition> [AND <condition> ...]] 
    [ORDER BY <property> [ASC | DESC] [, <property> [ASC | DESC] ...]] 
    [LIMIT [<offset>,]<count>] 
    [OFFSET <offset>] 

<condition> := <property> {< | <= | > | >= | = | != } <value> 
<condition> := <property> IN <list> 
<condition> := ANCESTOR IS <entity or key> 

:= в трех последних строках означает, что <condition> в основном выражение может быть заменено выражением справа от := в любой из трех операторов <condition>.

В примере, они решили выбрать * вместо __key__, то <kind> является Pet, есть только один WHERE состояние, и нет ORDER BY, LIMIT или OFFSET положения.

Таким образом, основное выражение упрощается:

SELECT * FROM Pet WHERE <condition> 

Затем мы можем заменить первое выражение условие, а именно:

<condition> := <property> {< | <= | > | >= | = | != } <value> 

Результирующее в:

SELECT * FROM Pet WHERE <property> {< | <= | > | >= | = | != } <value> 

В примере, <property> - owner, оператор =, а <value> является :1, то есть:

SELECT * FROM Pet WHERE owner = :1 

В соответствии с the documentation for the GqlQuery class, то: 1 означает, что значение будет связан с первым аргументом GqlQuery() (после запроса). Таким образом, в примере значение равно users.get_current_user().

Update:

Я не думаю, что любой из тех, кто будет работать, потому что они оба отсутствуют двойные кавычки, чтобы закончить строку запроса. Тем не менее, оба из следующих должно работать:

query = db.GqlQuery(
    "SELECT * FROM Rep WHERE author = :1", 
    users.get_current_user()) 

user = users.get_current_user() 
query = db.GqlQuery(
    "SELECT * FROM Rep WHERE author = :1", 
    user) 

После того, как у вас есть объект запроса вы можете вызвать fetch() на нем, чтобы получить элементы в виде списка. Или вы также можете выполнять итерацию непосредственно по запросу.

+0

Спасибо за подробный ответ. Другой быстрый вопрос: этот запрос работает: 'query = list (db.GqlQuery (" SELECT * FROM Rep WHERE author = users.get_current_user())) 'Но если я определяю' user = users.get_current_user() 'и попробую запрос 'query = list (db.GqlQuery ("SELECT * FROM Rep WHERE author = user))' тогда это не сработает. Я получаю ошибку 'SyntaxError: EOL во время сканирования строкового литерала' Любое предложение? Еще раз спасибо! – Zeynel

+1

Я обновил свой ответ. –

+0

Отлично! Спасибо. – Zeynel