【问题标题】:GQL Syntax conditionGQL 语法条件
【发布时间】:2010-11-01 00:35:16
【问题描述】:

我有一个简单的问题:

在 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 是什么?

根据语法,那里应该有:=

谢谢。

【问题讨论】:

    标签: google-app-engine gql


    【解决方案1】:

    您发布的语法链接上的 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>
    

    最后三行中的:= 表示主表达式中的&lt;condition&gt; 可以替换为三个&lt;condition&gt; 语句中的任何一个中:= 右侧的表达式。

    在示例中,他们选择了* 而不是__key__&lt;kind&gt;Pet,只有一个WHERE 条件,并且没有ORDER BYLIMITOFFSET 子句。

    所以主表达式简化为:

    SELECT * FROM Pet WHERE <condition>
    

    然后我们可以替换第一个条件表达式,即:

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

    导致:

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

    本例中&lt;property&gt;owner,运算符为=&lt;value&gt;:1,即:

    SELECT * FROM Pet WHERE owner = :1
    

    根据the documentation for the GqlQuery class,:1 表示该值将绑定到GqlQuery() 的第一个参数(在查询之后)。所以在示例中,值为users.get_current_user()

    更新:

    我认为这两种方法都行不通,因为它们都缺少双引号来结束查询字符串。但是,以下两种方法都应该起作用:

    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() 来获取列表中的项目。或者,您也可以直接遍历查询。

    【讨论】:

    • 感谢您的详细回答。另一个简单的问题:这个查询有效: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 while scanning string literal 有什么建议吗?再次感谢!
    猜你喜欢
    • 2018-06-21
    • 1970-01-01
    • 2018-10-15
    • 2012-11-30
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多