sqlalchemy 创建整数列表作为子查询

1 投票
1 回答
946 浏览
提问于 2025-04-18 02:36

我有一个问题,需要在一段年份上进行连接,比如2012年、2013年和2014年。所有这些年份都必须返回数据行,即使某一年没有值也要返回。在SQL中,这看起来像这样:

SELECT
    *
FROM
    kpi.unit_type_row_model
CROSS JOIN
    ( SELECT 2012 AS Year UNION ALL SELECT 2013 UNION ALL SELECT 2014 ) AS Y

    -- MORE JOINS FOR GETTING VALUES

我该如何创建一个子查询:

SELECT 2012 AS Year UNION ALL SELECT 2013 UNION ALL SELECT 2014

2012年、2013年和2014年作为输入值,并且需要动态生成这个联合查询。

1 个回答

1
  1. 在回答SQLAlchemy中是否可以显式使用CROSS JOIN?的问题时提到,sqlalchemy中没有明确的CROSS JOIN。不过,你可以通过从两个(或更多)表中直接选择数据,而不加任何join条件,来达到类似的效果。
  2. 要获取第二个选择,可以简单地使用text这个构造。

把这两者结合起来,下面就是解决方案:

years = range(2012, 2016)
txt = " UNION ALL ".join("SELECT {} AS Year".format(y) for y in years)
stmt = text(txt).columns(Year=Integer) # @note: works only on sqlachemy >= 0.9
# stmt = text(txt, typemap={'Year': Integer}) # note: fall back for SA version < 0.9
q = session.query(MyClass, stmt) # @note: since there is no JOIN, it will return cartesian product
for row in q.all():
    print(row)

撰写回答