【问题标题】:GQL Query in AppEngineAppEngine 中的 GQL 查询
【发布时间】:2012-08-15 05:18:16
【问题描述】:

我正在使用 dataStore 试图执行一个简单的查询,但它没有按预期工作:

class User_Machine(db.Model):
    machine_id = db.IntegerProperty (required = True)
    username = db.StringProperty (required = True)
    last_call = db.DateTimeProperty (auto_now = True)

def query(username, machine_id)
    q = db.GqlQuery('SELECT * FROM User_Machine WHERE username=:1 AND machine_id=:2', username, machine_id)
    r = q.get()
    return r

print query('uherran', 23)

我的回答是:

我期待着阅读这条记录:

datastopre 查看器中的值是:

Enitty Kind  User_Machine
Entity Key   ahBkZXZ-Z2VzdG9yYXZpc29zchILEgxVc2VyX01hY2hpbmUYKAw
ID   40
username (string)   uherran
last_call (datetime)    2012-08-19 09:57:35
machine_id (long)       23

我对查询如何进行的理解一定是完全错误的。

有人可以帮忙吗?

谢谢。

事实上。我稍微调整了一下,但我的代码更清楚了,但似乎我没有进行适当的错误检查。

代码是:

def check_machine_username(self, machine_id, username):
        key='CHECK_MACHINE_USERNAME_'+machine_id+'_'+username
        q= memcache.get(key)
        if q:
            return True
        else:
            logging.info(username)
            logging.info(machine_id)
            q = dbstructure.User_Machine.all()
            q.filter('username = ', username)
            q.filter('machine_id = ', machine_id)

            if q.get():
                loggin.info('query right')
                memcache.set(key,True)
                return True
            else:
                logging.info('query wrong')
                return False

无论我的 User_machine 数据库中有什么,查询总是返回空。

【问题讨论】:

  • 正如@GuidoVanRossum 所说,您可能将一个字符串作为您的machine_id 传递,特别是当您在check_machine_username 中定义key 时没有错误(因为它应该尝试连接一个字符串和一个整数,这会失败)。

标签: python google-app-engine datastore gql


【解决方案1】:

我注意到的问题是machine_id 是一个整数,而我使用的是字符串。

q.filter('username = ', username)
q.filter('machine_id = ', int(machine_id))
                          ^^^

假设类型是一件坏事。

感谢每一个人。

【讨论】:

    【解决方案2】:

    我的猜测是,在失败的情况下,您的 machine_id 是一个字符串,而它应该是一个 int。

    【讨论】:

    • 感谢您的回答...我只是注意到它并试图更新我的问题。
    【解决方案3】:

    看起来这是因为您没有将函数的值返回给您的print(我可能会也可能不会一直这样做:))。试试这个:

    def query(username, machine_id)
        q = db.GqlQuery('SELECT * FROM User_Machine WHERE username=:1 AND machine_id=:2', username, machine_id)
        r = q.get()
        return r # or just return q.get()
    

    请注意,这将返回一个 User_Machine 对象(而不是您可能期望的格式化字典/其他响应),然后您需要处理该对象(例如,而不是 print,将其分配给 @987654325 @变量,然后你可以通过result.machine_id等来访问它的属性。

    您也可以使用 Query 对象来完成同样的事情:

    def query(username, machine_id)
        # Same as using SELECT * in the Gql query above)
        q = User_Machine.all()
    
        # Then apply the filters (you can also do q.filter(..).filter(..))
        q.filter('username = ', username)
        q.filter('machine_id = ', machine_id)
        return q.get()
    

    【讨论】:

    • 感谢您的帮助。当我做我的问题时,我似乎打错了。我在回答中做了一些澄清。
    猜你喜欢
    • 2011-11-10
    • 2012-06-13
    • 2011-04-08
    • 2011-08-17
    • 2017-06-20
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多