Sqlalchemy结合SQLite使用CTE列天数调用DATE函数生成日期问题
问题根因
你代码中用Python f字符串拼接f'+{ints.c.num} days'的逻辑是在Python构造SQL表达式阶段执行的,此时ints.c.num只是SQLAlchemy的列对象,转字符串后为anon_1.num,最终传给数据库的是固定字符串'+anon_1.num days',而非每行动态拼接num值的间隔参数,DATE函数无法解析非法间隔参数,因此返回None。
解决方法
你需要将字符串拼接逻辑放到SQL侧执行,让数据库查询时动态将每行的num值拼入间隔字符串,修改后的代码如下:
from sqlalchemy import func, literal, union_all, select with Session(DB) as session: ints = union_all( select(literal(1).label('num')), select(2), select(3), select(4), select(5), select(6), select(7), select(8), select(9), select(10), ).cte() calendar = session.execute( select( ints.c.num, # 使用SQL原生的concat函数实现动态拼接间隔参数 func.DATE(func.current_date(), func.concat('+', ints.c.num, ' days')) ).select_from(ints) ) for row in calendar: print(row)
验证说明
修改后生成的SQL会对应调整为动态拼接逻辑,数据库执行时会将每行的num值实际代入间隔计算,即可正常返回对应日期。
内容的提问来源于stack exchange,提问作者Ed Danileyko
相关产品推荐
相关产品推荐

