SQLAlchemy使用两个联接从子查询中选择

SQLAlchemy使用两个联接从子查询中选择,sqlalchemy,Sqlalchemy,我几乎已经知道如何将此查询转换为SQLAlchemy: 从“选择”菜单中选择u.* 单位编号:, 活动 maxOA的maxu 从活动 按单位分组\u id a1 上的内部联接活动a2 a2.unit\u id=a1.unit\u id和a2.at=a1.maxOA 内连接单元u on u、 id=a2.unit_id,其中a2.activity='activateReq'; 我的表看起来像gDB是保存SQLAlchemy DB连接的全局变量: 类UnitgDB.Model: __tablenam

我几乎已经知道如何将此查询转换为SQLAlchemy:

从“选择”菜单中选择u.* 单位编号:, 活动 maxOA的maxu 从活动 按单位分组\u id a1 上的内部联接活动a2 a2.unit\u id=a1.unit\u id和a2.at=a1.maxOA 内连接单元u on u、 id=a2.unit_id,其中a2.activity='activateReq'; 我的表看起来像gDB是保存SQLAlchemy DB连接的全局变量:

类UnitgDB.Model: __tablename_uuu='单位' id=gDB.Column'id',gDB.Integer,主键=True owner\u id=gDB.Column'owner\u id',gDB.ForeignKey'User.id' owner=gDB.relationshipUser,primaryjoin=owner\u id==User.id unitNumber=gDB.Column'unit\u number',gDB.Integer street=gDB.列'street',gDB.String255 city=gDB.Column'city',gDB.String255 state=gDB.Column'state',gDB.String2 zip=gDB.Column'zip',gDB.String9 serviceInstallDate=gDB.Column'service\u install\u date',gDB.DateTime activity=gDB.relationship'activity',backref='unit\u id',lazy='select',order\u by=descActivity.occurredAt 定义报告自我: return.formatself.unitNumber,self.street 类ActivitygDB.Model: __tablename_uu='Activity' id=gDB.Column'id',gDB.Integer,主键=True unitID=gDB.Column'unit\u id',gDB.ForeignKey'unit.id' unit=gDB.relationshipUnit,primaryjoin=unitID==unit.id agentID=gDB.Column'agent_id',gDB.ForeignKey'User.id' agent=gDB.relationshipUser,primaryjoin=agentID==User.id occurredAt=gDB.Column'occurrent_at',gDB.DateTime activity=gDB.Column'activity',gDB.String32 notes=gDB.Column'notes',gDB.String 定义报告自我: return.formatself.activity,self.occurredAt 我已经走了这么远:

db.session.queryActivity.unitID、Activity.Activity、func.maxActivity.occurredAt.labelmaxOA .group_byActivity.unitID .子查询 a2=表达式别名活动 u=表达式别名单位 q=db.session.query1 .joina2,和_a2.c.unit_id==a1.c.unit_id,a2.c.at==a1.c.maxOA .joinu,u.c.id==a2.c.unit\u id.filtera2.c.activity=='activateReq' q、 全部 q、 all返回的是正确的行集,但我想要的是Unit的列,而不是子查询a1的列

更新

我更接近了:诀窍是在本例中查询所需的列,即u的所有列,然后从子查询a1中选择_:

q=db.session.queryu.select_from a1.joina2,并且_a2.c.unit_id==a1.c.unit_id,a2.c.accurrent_at==a1.c.maxOA.joinu,u.c.id==a2.c.unit_id.filtera2.c.activity=='activateReq' 现在的问题是,生成的单元实例没有相关的用户所有者\u id/owner对象;我的Jinja模板尝试引用user.owner,我得到

'sqlalchemy.util._collections.result object' has no attribute 'owner'

我也不知道这是最简洁还是最有效的方法。

啊!我想出来了。我正在使用expression.alias而不是orm.aliased。应该是这样的:

a1=gDB.session.queryActivity.unitID、Activity.Activity、func.maxActivity.occurredAt.labelmaxOA\ .group_byActivity.unitID\ .子查询 a2=别名活动,名称=a2 u=aliasedUnit,name=u q=gDB.session.queryu.select_froma1\ .joina2,和_a2.unitID==a1.c.unit_id,a2.occurredAt==a1.c.maxOA\ .joinu,u.id==a2.unitID.filtera2.activity=='activateReq'