两个表的GQL
你好,我正在用Python做一个很小的应用程序,使用的是Google App Engine。我的问题是,我有两个表,一个是“clients”(客户),另一个是“requests”(请求)。“clients”表里有邮箱和名字这两个字段,而“requests”表里有邮箱和问题这两个字段。我想做一个查询,返回每个请求的邮箱、问题和客户名字,前提是这两个表里的邮箱是相同的。有人能帮帮我吗?
2 个回答
0
使用这些模型:
class Client(db.Model):
email = db.StringProperty()
name = db.StringProperty()
class Request(db.Model):
client = db.ReferenceProperty(Client, collection_name='requests')
issue = db.StringProperty()
用这段代码可以查询数据
from modelos import Client,Request
ctes=Client.all().filter("email =","somemail@mailbox.com.mx")
for ct in ctes:
allRequest4ThisUser=Request.all().filter("client =",ct)
for req in allRequest4ThisUser:
print req.issue
3
这个应用引擎的数据存储不支持连接查询,所以你不能用GQL来解决这个问题。你可以用两个获取操作,一个是获取客户信息,另一个是获取请求信息,或者你可以使用一个叫做ReferenceProperty的东西来建立这两个实体之间的关系。
如果你需要建模一个一对多的关系,可以用ReferenceProperty来实现。对于你的情况,可能会像这样:
class Client(db.Model):
email = db.UserProperty()
name = db.StringProperty()
class Request(db.Model):
client = db.ReferencePrpoerty(Client, collection_name='requests')
issue = db.StringProperty()
任何与请求关联的客户实体,都会自动获得一个叫做requests的属性,这个属性是一个查询对象,可以返回所有与特定客户实体相关的请求实体,这些请求的client字段会设置为你正在处理的客户实体。
你可能还想确保创建请求实体的代码,把每个新创建的请求实体都设置为特定用户的客户实体的祖先。把这些相关的项目放在同一个实体组里,对性能和事务处理会有好处。