2

我正在使用 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 数据库中有什么,该查询总是返回空。

4

3 回答 3

1

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

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

假设类型是坏事。

谢谢大家。

于 2012-08-20T04:44:48.437 回答
1

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

于 2012-08-19T20:42:39.190 回答
0

看起来这是因为您没有将函数的值返回给您的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,将其分配给result变量,然后您可以通过执行访问其属性result.machine_id, ETC。)。

你也可以使用 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()
于 2012-08-19T18:06:45.913 回答