如何在SQLAlchemy中按列名列表过滤查询,校验字段是否非0
实现方案
你需要先遍历列名列表,为每个字段单独生成!= 0的比较条件,再将所有条件拆包传入or_函数即可。
常规ORM/Table对象实现(推荐)
以SQLAlchemy框架为例,示例代码如下:
from sqlalchemy import or_ # 你的列名列表 header_texts = ["Column_1", "Column_2", "Column_n"] # 1. 生成每个列的过滤条件列表 # 若使用ORM模型,替换YourModel为你定义的模型类 conditions = [getattr(YourModel, col) != 0 for col in header_texts] # 若使用Core Table对象,写法如下: # conditions = [your_table_obj.c[col] != 0 for col in header_texts] # 2. 把条件列表拆包传给or_函数 query = query.filter(or_(*conditions))
字符串构造实现(仅用于列名完全可控的场景)
如果没有定义映射对象,也可以用text构造原生条件,注意该方法存在SQL注入风险,必须确保header_texts的内容完全可信:
from sqlalchemy import or_, text header_texts = ["Column_1", "Column_2", "Column_n"] conditions = [text(f"{col} != 0") for col in header_texts] query = query.filter(or_(*conditions))
原代码问题说明
你之前的写法是直接将整个列名列表和0做比较,没有为每个单独的列生成比较逻辑,因此无法生成符合要求的SQL语句。
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

