两个表的GQL

0 投票
2 回答
1007 浏览
提问于 2025-04-15 17:38

你好,我正在用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字段会设置为你正在处理的客户实体。

你可能还想确保创建请求实体的代码,把每个新创建的请求实体都设置为特定用户的客户实体的祖先。把这些相关的项目放在同一个实体组里,对性能和事务处理会有好处。

撰写回答