我在Users
的桌子上有Visits
与一对多关系的表格(每个User
有两个Visits
)。 Visits
中有多列,包括Score
。对于每个User
,我想计算两个Score
中Visits
的差异。
使用SQLAlchemy执行此操作的最明智的方法是什么?为了代替直接在数据库调用中计算差异,我可以为每个Score
提取Visit
,假设它们已经通过拥有相同的用户而匹配在一起。然后它只是Score1-Score2
。
注意:直接将所有Score
和Users
拉到Visits.visit_number==1
,然后再将Visits.visit_number==2
拉出来。
data = session.query(Visit.Score, User.id).join(User).filter(Visits.visit_number==1)
data2 = session.query(Visit.Score, User.id).join(User).filter(Visits.visit_number==2)
问题是匹配两组分数是一个主要的痛苦(因为它们不会由用户按顺序排列,并且可能有用户尚未进行第二次访问)。我确信在SQLAlchemy中有一种优雅的方法,可能是别名。
答案 0 :(得分:1)
以下代码将为(至少)2次访问的用户返回(User.id, Score1-Score2)
对列表:
from sqlalchemy.orm import aliased
Visit1 = aliased(Visit)
Visit2 = aliased(Visit)
session.query(User)\
.join(Visit1, (Visit1.user_id==User.id) & (Visit1.visit_number==1))\
.join(Visit2, (Visit2.user_id==User.id) & (Visit2.visit_number==2))\
.values(User.id, Visit1.Score-Visit2.Score)
此处Visit.user_id
是指User.id
。
事实上,从User
的表中排除Visit
的表是安全的,因为User
的表已经有{{1}}的ID,并且您不会从其请求其他数据表