繁体   English   中英

在 SQLAlchemy (Python) 中联合查询列表的正确方法是什么?

[英]What's the proper way to UNION a list of queries in SQLAlchemy (Python)?

所以我有一个 SQLAlchemy Query对象的列表,我想 UNION 所有这些对象。

例如,如果我的列表中有以下等价物:

SELECT id, name FROM person
SELECT id, name FROM employee

我会得到相当于:

(SELECT id, name FROM person)
UNION
(SELECT id, name FROM employee)

我不知道列表中有什么,列表可能包含许多Query对象,但当然我列表中每个 SQLAlchemy Query object 的结果签名是 100% 相同的。

目前我这样做 UNION 是这样的:

if not q_list:
    return []

big_q = q_list.pop(0)
if q_list:
    big_q = big_q.union(*q_list)
result = [dict(row) for row in dbsession.execute(big_q)]

但是由于某些奇怪的原因,我没有得到与我单独运行所有查询然后将结果连接在一起时相同的结果。 我必须错误地做联合。 那我该怎么做 UNION 呢?

我想你可能期待UNION ALL

来自postgresql 文档,第二部分..

UNION 有效地将 query2 的结果附加到 query1 的结果(尽管不能保证这是实际返回行的顺序)。

此外,它以与 DISTINCT 相同的方式从其结果中消除重复行,除非使用 UNION ALL。

尝试这个:

if q_list:
    big_q = big_q.union_all(*q_list)

还有一个 function 来执行union all ,例如:

q = union_all(*q_list)

我的问题与union号召无关。 我对 UNION 的查询列表是用 function 创建的,它在每个 object 上做这样的事情:

sql.expression.bindparam(
    "current_timestamp", value=start_timestamp
)

似乎因为我列表中的所有查询 object 都具有相同的参数名称 ( current_timestamp ),所以当使用bindparam时,它们都使用相同的值而不是它们各自的值。

我只需要使用unique参数来解决我的问题:

sql.expression.bindparam(
    "current_timestamp", unique=True, value=start_timestamp
)

这样他们都能按预期获得start_timestamp值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM