SqlAlchemy核心union_all没有添加括号

时间:2015-03-31 14:03:51

标签: python-2.7 sqlalchemy flask-sqlalchemy

我有以下示例代码:

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'))

所以,如果有人有任何想法进行优化,或者让我知道这是否与它一样好。我很感激。

1 个答案:

答案 0 :(得分: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)