sqlalchemy 创建整数列表作为子查询
我有一个问题,需要在一段年份上进行连接,比如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
- 在回答SQLAlchemy中是否可以显式使用CROSS JOIN?的问题时提到,
sqlalchemy
中没有明确的CROSS JOIN
。不过,你可以通过从两个(或更多)表中直接选择数据,而不加任何join
条件,来达到类似的效果。 - 要获取第二个选择,可以简单地使用
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)