如何在SQLAlchemy中为查询追加子查询作为OR条件?
问题
现有子查询代码:
sub_query = db.query(Table1.id).filter(Table1.id.in_(db.query(Table2.ref_col).filter(Table2.col1 == 'value')))
基础查询代码:
query = db.query(Table1).filter(Table1.col1 == 'value1' | Table1.col2 == 'value2')
需要将该子查询作为OR条件追加到基础查询的WHERE子句中,生成如下SQL:
SELECT * From Table1 where Table1.col1 = 'value1' or Table1.col2 = 'value2' or Table1.id in (select Table2.ref_id from Table2 where Table2.col1 = 'value')
要求不能用子查询初始化查询,必须通过ORM方式在已有的基础查询上追加该子查询条件。
解决方案
首先纠正一个误区:你原定义的sub_query是冗余的,Table1.id.in_(...)本身就是一个可直接用于WHERE子句的布尔条件,不需要外层的db.query()包裹。
直接在基础查询上追加OR条件即可,有两种写法:
写法一:使用位运算符|
# 定义子查询条件 sub_condition = Table1.id.in_(db.query(Table2.ref_col).filter(Table2.col1 == 'value')) # 追加到基础查询 query = query.filter(Table1.col1 == 'value1' | Table1.col2 == 'value2' | sub_condition)
写法二:使用or_()函数(更清晰,推荐)
先导入or_函数:
from sqlalchemy import or_
然后追加条件:
sub_condition = Table1.id.in_(db.query(Table2.ref_col).filter(Table2.col1 == 'value')) query = query.filter(or_( Table1.col1 == 'value1', Table1.col2 == 'value2', sub_condition ))
两种写法都会生成你需要的目标SQL,完全符合“在已有的基础查询上通过ORM方式追加子查询条件”的要求。
内容的提问来源于stack exchange,提问作者Biswas
相关产品推荐
相关产品推荐

