簡體   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