使用sqlalchemy比较两个数据库条目

时间:2011-12-07 18:49:03

标签: python sql sqlalchemy

我在Users的桌子上有Visits与一对多关系的表格(每个User有两个Visits)。 Visits中有多列,包括Score。对于每个User,我想计算两个ScoreVisits的差异。

使用SQLAlchemy执行此操作的最明智的方法是什么?为了代替直接在数据库调用中计算差异,我可以为每个Score提取Visit,假设它们已经通过拥有相同的用户而匹配在一起。然后它只是Score1-Score2

注意:直接将所有ScoreUsers拉到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中有一种优雅的方法,可能是别名。

1 个答案:

答案 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,并且您不会从其请求其他数据表