如何将含OR包裹AND分组条件的原生SQL转换为SQLAlchemy ORM语句
SQLAlchemy多AND分组OR查询实现方案
首先需要导入SQLAlchemy提供的逻辑运算符函数:
from sqlalchemy import or_, and_
标准实现写法
直接将每个独立的AND条件分组用and_()包裹,作为参数传入or_()中即可完全匹配你需要的原生SQL逻辑:
session.query(models.UpcomingThings).filter( or_( # 第一个AND分组,对应原生SQL第一组括号内的条件 and_( models.UpcomingThings.Id == 'ES1234', models.UpcomingThings.Date == '2021-08-18', models.UpcomingThings.Period == 27 ), # 第二个AND分组,对应原生SQL第二组括号内的条件 and_( models.UpcomingThings.Id == 'ES0197', models.UpcomingThings.Date == '2021-08-18', models.UpcomingThings.Period == 29 ) ) ).all()
批量多分组优化写法
如果后续需要匹配的组合条件更多,还可以用tuple_批量匹配,代码更简洁:
from sqlalchemy import tuple_ session.query(models.UpcomingThings).filter( tuple_( models.UpcomingThings.Id, models.UpcomingThings.Date, models.UpcomingThings.Period ).in_([ ('ES1234', '2021-08-18', 27), ('ES0197', '2021-08-18', 29) ]) ).all()
注意事项
如果Date字段在模型中定义为日期/时间类型,建议传入datetime.date(2021,8,18)类型对象而非字符串,避免不同数据库的日期格式适配问题。
内容的提问来源于stack exchange,提问作者AdrianC
相关产品推荐
相关产品推荐

