Question

I have a simple question:

In GQL syntax summary

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

but in an example here

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

What is :1 ?

According to syntax there should be := there.

Thanks.

Was it helpful?

Solution

The GQL grammar on the syntax link you posted is this:

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>

The := in the last three lines means that <condition> in the main expression can be replaced with the expression to the right of the := in any of the three <condition> statements.

In the example, they have chosen to select * instead of __key__, the <kind> is Pet, there is only one WHERE condition, and there are no ORDER BY, LIMIT or OFFSET clauses.

So the main expression simplifies to:

SELECT * FROM Pet WHERE <condition>

We can then substitute the first condition expression, ie:

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

Resulting in:

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

In the example, <property> is owner, the operator is =, and the <value> is :1, ie:

SELECT * FROM Pet WHERE owner = :1

According to the documentation for the GqlQuery class, the :1 means that the value will be bound to the first argument to GqlQuery() (after the query). So in the example, the value is users.get_current_user().

Update:

I don't think either of those would work, because they are both missing a double quote to end the string of the query. However, both of the following should work:

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)

Once you have the query object you can call fetch() on it to get the items as a list. Or, you can also iterate directly over the query.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top