【问题标题】:SqlAlchemy core union_all not adding parenthesesSqlAlchemy 核心 union_all 不加括号
【发布时间】:2015-06-04 21:37:51
【问题描述】:

我有以下示例代码:

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

所以,如果有人有任何优化的想法,或者让我知道这是否尽可能好。我会很感激的。

【问题讨论】:

    标签: python-2.7 sqlalchemy flask-sqlalchemy


    【解决方案1】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 2015-05-16
      • 1970-01-01
      • 2015-07-08
      相关资源
      最近更新 更多