如何根据列的值过滤 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_agggroup_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 结果?的主要内容,如果未能解决你的问题,请参考以下文章

您如何设置 sqlalchemy 关系ihp,以便子查询负载将根据属性过滤我们的结果

SQLAlchemy 根据另一个表中的值过滤表的最佳方法

如何根据数据集中某列的值制作散点图?

如何将sqlalchemy中列的默认值设置为关系中列的值?

SQLAlchemy:如何根据其后端有条件地选择列的类型

从列表中过滤为查询字符串 postgresql flask sqlalchemy [重复]