python-sqlalchemy-分组项目并遍历子列表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-sqlalchemy-分组项目并遍历子列表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1343字,纯文字阅读大概需要2分钟。
内容图文
![python-sqlalchemy-分组项目并遍历子列表](/upload/InfoBanner/zyjiaocheng/883/6b8523c5489c4ad6af6a1b91958b8929.jpg)
考虑一个这样的表:
| Name | Version | Other |
| ---------------------|-------|
| Foo | 1 | 'a' |
| Foo | 2 | 'b' |
| Bar | 5 | 'c' |
| Baz | 3 | 'd' |
| Baz | 4 | 'e' |
| Baz | 5 | 'f' |
--------------------------------
我想编写一个sqlalchemy查询语句来列出所有版本(作为映射器对象,而不仅仅是Name列),其最高版本为:Foo-2-b,Bar-5-c,Baz-5-f.我知道我必须使用group_by方法,但是除此之外,我对如何检索子列表(然后找到max元素)感到困惑. SQLAlchemy文档显然对此并不十分清楚.
在实际情况下,还有许多其他列(例如“其他”)-这就是为什么我需要返回实际的行对象(映射器类)而不是仅返回“名称”值的原因.
解决方法:
如果需要完整的对象,则需要在子查询中按名称选择最大版本,然后加入该版本:
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()
这将导致如下所示:
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
请注意,如果存在多个具有最高版本的行,则将获得多个具有相同名称的行.
内容总结
以上是互联网集市为您收集整理的python-sqlalchemy-分组项目并遍历子列表全部内容,希望文章能够帮你解决python-sqlalchemy-分组项目并遍历子列表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。