将含别名与DISTINCT子查询的SQLite语句转换为SQLAlchemy(FASTApi场景)
将SQLite查询转换为SQLAlchemy代码(FastAPI适用)
原SQL逻辑拆解
原查询核心逻辑:
- 从
prices表提取所有去重的security_id(子查询s) - 左连接
prices表(别名p),筛选每个security_id在指定时间之前的记录 - 按
security_id分组,取每组中最新的price_datetime及对应price
完整SQLAlchemy实现代码
from sqlalchemy import select, func, distinct from your_module import models # 替换为实际models模块路径 from datetime import datetime # 1. 构建去重security_id的子查询,对应原SQL中的(SELECT DISTINCT security_id FROM prices) s subquery_s = select(distinct(models.Price.security_id)).subquery("s") # 2. 构建主查询,实现左连接、过滤、分组逻辑 query = ( select( subquery_s.c.security_id, models.Price.price, func.max(models.Price.price_datetime).label("price_datetime") ) .select_from(subquery_s) .outerjoin( models.Price, (models.Price.security_id == subquery_s.c.security_id) & (models.Price.price_datetime <= datetime(2022, 8, 10, 19, 0, 0)) ) .group_by(subquery_s.c.security_id) ) # FastAPI中执行查询示例(需结合数据库会话) # result = db_session.execute(query).all()
关键细节说明
- 子查询处理:用
distinct()+subquery()实现原SQL的去重子查询,指定别名s后可通过subquery_s.c访问子查询字段 - 左连接逻辑:
outerjoin()对应原SQL的LEFT JOIN,连接条件通过&组合字段匹配和时间过滤规则 - 字段别名:用
label()给聚合函数结果指定price_datetime别名,和原SQL输出字段保持一致 - 分组规则:按子查询的
security_id分组,确保每个security_id仅返回一条最新记录
对比你的初步尝试
你的代码仅列出了查询字段,缺少子查询构建、表连接、过滤条件和分组逻辑,上述代码补充了这些核心部分,完全匹配原SQL的功能。
内容的提问来源于stack exchange,提问作者cpage
相关产品推荐
相关产品推荐

