【问题标题】:SQLAlchemy Union Parenthesis IssueSQLAlchemy 联合括号问题
【发布时间】:2013-01-18 08:16:54
【问题描述】:

我需要生成类似于以下的查询:

(select * from ... where .. and .. order by .. limit ..)
union all
(select * from ... where .. and .. order by .. limit ..)
order by ..

使用 SQLAlchemy,我创建了两个查询对象,如下所示:

q1 = Session.query(..).filter(..).filter(..).order_by(..).limit(..)
q2 = Session.query(..).filter(..).filter(..).order_by(..).limit(..)
q = q1.union_all(q2).order_by(..).all()

但是它不起作用,因为 SQLAlchemy 生成查询:q1 和 q2 不在括号内,它会产生错误。

我怎样才能在括号内为 q1 q2 union 获取这些语句以产生上述查询?

【问题讨论】:

    标签: python python-2.7 sqlalchemy


    【解决方案1】:

    您需要创建子查询,然后从这些子查询中进行选择:

    from sqlalchemy import union_all
    
    q1 = Session.query(..).filter(..).filter(..).order_by(..).limit(..).subquery()
    q2 = Session.query(..).filter(..).filter(..).order_by(..).limit(..).subquery()
    q = Session.query(..).select_entity_from(union_all(q1.select(), q2.select()).order_by(..).all()
    

    .subquery() method 返回一个Alias object,它不支持直接union_all 查询。因此,我们需要构建一个select_entity_from() construct,而是传入sqlalchemy.sql.expression.union_all() function 结果,这样您仍然可以将结果映射到正确的对象。

    【讨论】:

    • 嗨,Martijn。联合查询的 query() 函数在这里的目的是什么?
    • 你的情况完全匹配this sqlalchemy list thread..它使用相同的技术。 .subquery() 返回一个别名对象,它没有 union_all 方法,所以我们必须使用 .select_from() 来代替 union_all 函数。
    • 确实如此,而且确实奏效了!谢谢你。我已经在各个位置不停地搜索了一段时间,但令人惊讶的是没有找到那个线程。傻我。再次感谢!
    • 这对我不起作用(我得到了额外的行),直到我将 select_from 更改为 select_entity_from。不知道为什么我的情况不同。
    • 0.9 中的行为发生了变化(此答案早于 0.9),select_entity_from() 现在是正确的使用方法。
    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2019-07-31
    • 2013-10-04
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多