用sqlalchemy比较两个数据库条目

0 投票
1 回答
2026 浏览
提问于 2025-04-17 07:55

我有一个叫做 Users 的表,这个表和一个叫做 Visits 的表之间有一种一对多的关系(每个 User 都有两个 Visits)。在 Visits 表里,有多个列,其中包括 Score。我想为每个 User 计算他们在两个 Visits 中的 Score 差值。

用 SQLAlchemy 来做这件事,最简单的方法是什么?如果不直接在数据库里计算差值,我也可以先把每个 VisitScore 拉出来,只要它们已经通过相同的用户关联在一起。这样我就可以用 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 个回答

1

下面的代码会返回一个列表,里面包含了那些至少有两次访问的用户的 (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 的 ID,而且你也不需要从 User 表中获取其他数据。

撰写回答