如何根据列的值过滤 SQLAlchemy 结果?
Posted
技术标签:
【中文标题】如何根据列的值过滤 SQLAlchemy 结果?【英文标题】:How do I filter SQLAlchemy results based on a columns' value? 【发布时间】:2016-08-01 21:46:44 【问题描述】:我正在尝试序列化 SQLAlchemy 查询的结果。我是 ORM 的新手,所以我不确定在检索结果集后如何过滤它。如果我要展平对象,结果集如下所示:
A1 B1 V1
A1 B1 V2
A2 B2 V3
我需要将这些序列化为一个对象列表,每个 A 的唯一值 1 个,每个对象都有一个 V 值列表。即:
对象1:
答:A1
B:B1
V:V1,V2
对象2:
A:A2
B:B2
V:V3
有没有办法遍历给定列上的所有唯一值,但能够从其他列返回值列表?
【问题讨论】:
【参考方案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() 函数。文档有点不靠谱,但我玩了一会儿就到了。
【讨论】:
以上是关于如何根据列的值过滤 SQLAlchemy 结果?的主要内容,如果未能解决你的问题,请参考以下文章