【问题标题】:How do I filter SQLAlchemy results based on a columns' value?如何根据列的值过滤 SQLAlchemy 结果?
【发布时间】:2016-08-01 21:46:44
【问题描述】:
我正在尝试序列化 SQLAlchemy 查询的结果。我是 ORM 的新手,所以我不确定在检索结果集后如何过滤它。如果我要展平对象,结果集如下所示:
A1 B1 V1
A1 B1 V2
A2 B2 V3
我需要将这些序列化为一个对象列表,每个 A 的唯一值 1 个,每个对象都有一个 V 值列表。即:
对象1:
对象2:
有没有办法遍历给定列上的所有唯一值,但能够从其他列返回值列表?
【问题讨论】:
标签:
python
orm
sqlalchemy
【解决方案1】:
是的,只需使用 func.array_agg 和 group_by
import sqlalchemy.sql.functions as func
session.query(Object.col1, Object.col2, func.array_agg(Object.col3))
.group_by(Object.col1)
.group_by(Object.col2)
.all()
但这仅适用于具有等效聚合函数的数据库后端,除此之外,您只需要通过伪函数编写自己的组。 Sql alchemy 只是将你的 pythony 代码转换为适当的 sql,所有其他逻辑通常留给程序员。
等效的 Postgresql
SELECT col1, col2, array_agg(col3)
FROM objects
GROUP BY col1, col2;
【解决方案2】:
原来我需要使用关联表和joinedload() 函数。文档有点不靠谱,但我玩了一会儿就到了。