2015-03-31 25 views
1

我有下面的示例代碼:SQLAlchemy的核心union_all不加括號

queries = [] 
q1 = select([columns]).where(table.c.id == #).limit(#) 
queries.append(q1) 
q2 = select([columns]).where(table.c.id == #).limit(#) 
queries.append(q2) 

final_query = union_all(*queries) 

生成的SQL應該是這樣的:

(select columns from table where id = # limit #) 
UNION ALL 
(select columns from table where id = # limit #) 

但是,我越來越

select columns from table where id = # limit # 
UNION ALL 
select columns from table where id = # limit # 

我嘗試使用subquery,我的查詢如下:

q1 = subquery(select([columns]).where(table.c.id == #).limit(#)) 

生成的查詢則是這樣的:

SELECT UNION ALL SELECT UNION ALL 

我也想這樣做

q1 = select([columns]).where(table.c.id == #).limit(#)).subquery() 

但是,我得到的錯誤:

'Select' object has no attribute 'subquery' 

任何幫助,以獲得所需的輸出與我的子查詢包裹在括號?

注意:這不是question的重複,因爲我沒有使用Session。

編輯

好吧,這工作,但我不認爲這是非常有效的,而且它增加一個額外的select * from (my sub query),但它的作品。

q1 = select('*').select_from((select(columns).where(table.c.id == #).limit(#)).alias('q1')) 

所以,如果任何人有任何想法優化,或讓我知道這是否如它得到。我會很感激。

回答

0

SQLAlchemy的作者似乎意識到這一點,並在the SQLAlchemy 1.1 changelog page上提到了一個解決方法。總體思路是在每次選擇時都做.alias().select()

stmt1 = select([table1.c.x]).order_by(table1.c.y).limit(1).alias().select() 
stmt2 = select([table2.c.x]).order_by(table2.c.y).limit(2).alias().select() 

stmt = union(stmt1, stmt2) 
相關問題