SQLAlchemy select子句作为列

时间:2015-09-29 04:12:38

标签: python sql postgresql sqlalchemy

我知道以下方法可以通过不同的方式实现,但我正在寻找一种在SQLAlchemy中使用select语句作为列的特定方法。

示例查询是:

SELECT employee.*, (
        SELECT avg(salary) 
        FROM employee as e1 
        WHERE e1.department_id = e2.department_id
    ) as avg_salary
FROM employee as e2

我只使用SQLAlchemy中的Core组件。这是我到目前为止所得到的:

e1 = employee.alias('e1')
e2 = employee.alias('e2')

inner = select(
  columns=[func.mean(e1.salary).label('avg_salary')],
  from_obj=e1
  whereclause=e1.department_id == e2.department_id
)

outer = select(
  columns=[e2, inner.avg_salary],
  from_obj=e2
)

但是,这个(outer)会产生SELECT ... from employee as e1, (select ...) as e2,而不是我想要的查询。

如何使用SQLAlchemy核心来获取SQL查询?

1 个答案:

答案 0 :(得分:2)

我找到了解决方案。必须将选择查询添加到as_scalar的列中。如果我没有明确地这样做,SQLAlchemy会在FROM部分中呈现select查询。

这与this帖子有些矛盾,后者宣称as_scalar并非必要。但也许是因为我的查询不同而且内部使用了一种启发式算法来确定是否将查询放入查询的COLUMN或FROM部分。