sqlalchemy - 对项目进行分组并迭代子列表

Rei*_*ica 3 python sql sqlalchemy

考虑一下这样的表格:

| Name       | Version | Other |
| ---------------------|-------|
| Foo        | 1       | 'a'   |
| Foo        | 2       | 'b'   |
| Bar        | 5       | 'c'   |
| Baz        | 3       | 'd'   |
| Baz        | 4       | 'e'   |
| Baz        | 5       | 'f'   |
--------------------------------
Run Code Online (Sandbox Code Playgroud)

我想编写一个sqlalchemy查询语句来列出所有项目(作为mapper对象,而不仅仅是Name列),其中包含max version : Foo-2-b, Bar-5-c, Baz-5-f. 我明白我必须使用这个group_by方法,但除此之外,我很困惑如何检索子列表(然后找到最大元素).SQLAlchemy文档显然不是很清楚.

在实际场景中,还有许多其他列(如"其他") - 这就是为什么我需要返回实际的行对象(mapper类)而不仅仅是'Name'值.

Ant*_*sma 6

如果需要完整对象,则需要在子查询中按名称选择最大版本并加入到:

max_versions = session.query(Cls.name, func.max(Cls.version).label('max_version'))\
                      .group_by(Cls.name).subquery()
objs = session.query(Cls).join((max_versions,
           and_(Cls.name == max_versions.c.name,
                Cls.version == max_versions.c.max_version)
       )).all()
Run Code Online (Sandbox Code Playgroud)

这将导致类似这样的事情:

SELECT tbl.id AS tbl_id, tbl.name AS tbl_name, tbl.version AS tbl_version
FROM tbl JOIN (SELECT tbl.name AS name, max(tbl.version) AS max_version
FROM tbl GROUP BY tbl.name) AS anon_1 ON tbl.name = anon_1.name AND tbl.version = anon_1.max_version
Run Code Online (Sandbox Code Playgroud)

请注意,如果有多行具有最大版本,您将获得具有相同名称的多行.