[英]What's the proper way to describe an associative object by SQLalchemy the declarative way
[英]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.