2010-11-01 20 views
0

J'ai une question simple:GQL Syntaxe état

Dans GQL syntax summary

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

mais dans un example here

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

Qu'est-ce que :1?

Selon la syntaxe, il devrait y avoir := là.

Merci.

Répondre

5

La grammaire GQL sur le lien de syntaxe que vous avez envoyé ceci:

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> 

Le := dans les trois dernières lignes signifie que <condition> dans l'expression principale peut être remplacée par l'expression à droite de la := en l'une des trois déclarations <condition>.

Dans l'exemple, ils ont choisi de sélectionner * au lieu de __key__, le <kind> est Pet, il n'y a qu'une seule condition WHERE, et il n'y a pas ORDER BY, LIMIT ou OFFSET clauses.

Ainsi, l'expression principale simplifie à:

SELECT * FROM Pet WHERE <condition> 

On peut alors remplacer la première expression de condition, à savoir:

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

Entraînant:

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

Dans l'exemple, <property> est owner, l'opérateur est =, et la <value> est :1, à savoir:

SELECT * FROM Pet WHERE owner = :1 

Selon the documentation for the GqlQuery class, le: 1 signifie que la valeur est liée au premier argument de GqlQuery() (après la demande de recherche). Donc, dans l'exemple, la valeur est users.get_current_user().

Mise à jour:

Je ne pense pas non plus de ceux qui travailleraient, parce qu'ils sont tous les deux manquent un guillemet pour mettre fin à la chaîne de la requête. Cependant, les deux éléments suivants devraient fonctionner:

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) 

Une fois que vous avez l'objet de requête, vous pouvez appeler fetch() sur elle pour obtenir les éléments sous forme de liste. Ou, vous pouvez également itérer directement sur la requête.

+0

Merci pour la réponse détaillée. Une autre question rapide: Cette requête fonctionne: 'query = liste (db.GqlQuery (" SELECT * DE REP OERE auteur = users.get_current_user())) Mais si je définis 'user = users.get_current_user()' et essayez la requête 'query = liste (db.GqlQuery ("SELECT * FROM Rép où auteur = utilisateur))' alors cela ne fonctionne pas.J'obtiens l'erreur 'SyntaxError: EOL lors de l'analyse de la chaîne littérale' Toute suggestion? Merci encore – Zeynel

+1

J'ai mis à jour ma réponse –

+0

Great! Je vous remercie. – Zeynel