Python AppEngine中的GQL查询
我正在使用数据存储,试图执行一个简单的查询,但它无法正常工作:Python AppEngine中的GQL查询,python,google-app-engine,datastore,gql,Python,Google App Engine,Datastore,Gql,我正在使用数据存储,试图执行一个简单的查询,但它无法正常工作: 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_
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
我对querys的理解一定是完全错误的
有人能帮忙吗
谢谢
事实上。我对代码做了一点修改,以提供清晰性,但似乎我没有进行propper错误检查
代码是:
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
无论我在我的用户机器数据库中有什么,查询总是返回空的。这似乎是因为您没有将函数的值返回到您的
打印中(我可能会也可能不会一直这样做:)。试试这个:
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\u Machine
对象(而不是您可能期望的格式化字典/其他响应),然后您需要处理该对象(例如,代替print
,将其分配给result
变量,然后您可以通过执行result.Machine\u id
等操作来访问其属性)
您还可以使用查询对象完成相同的任务:
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()
我的猜测是,在失败的情况下,您的机器id是一个字符串,而它应该是一个int。我注意到的问题是,机器id
是一个整数,而我使用的是一个字符串
q.filter('username = ', username)
q.filter('machine_id = ', int(machine_id))
^^^
这是区分一个类型的坏处
谢谢大家。谢谢你们的帮助。好像我在提问时打错了字。我在回答中做了一些澄清。谢谢你的回答。。。我只是注意到了这一点,并试图更新我的问题。正如@GuidoVanRossum所说,您可能正在传递一个字符串作为您的机器id
,尤其是当您在检查机器用户名
中定义键时没有错误(因为它应该尝试连接字符串和整数,这将失败)。