You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLAlchemy中使用filter_by实现不等于条件查询?

解决query_from_DB函数中不等于条件查询的语法错误问题

首先咱们先理清楚你遇到问题的核心原因:
你用sp_id!="sp-10.1.10.149"这种写法时,一方面Python不允许把带!的表达式作为关键字参数(关键字参数必须是key=value的格式),这直接导致了SyntaxError: non-keyword arg after keyword arg报错;另一方面,你函数里用的SQLAlchemyfilter_by(**filter)方法,本身只支持等于关系的键值对查询,根本不兼容!=这类比较运算符。

下面给你两种可行的修改方案,按需选择:


方案一:重构函数支持灵活查询(推荐)

把函数里的filter_by替换成filter,让函数接收SQLAlchemy的条件表达式作为参数,这样就能支持所有类型的查询条件了:

def query_from_DB(obj, *conditions):
    DBSession = sessionmaker(bind=engine)
    session = DBSession()
    res = session.query(obj).filter(*conditions)
    session.close()
    return [x for x in res]

调用的时候直接传入字段的比较表达式:

query_from_DB(Router, Router.sp_id != "sp-10.1.10.149", Router.connectivity == "NO")

这种方式不仅解决了不等于的问题,还能轻松扩展到>、<、like等复杂查询场景,灵活性拉满。


方案二:兼容原调用风格,通过特殊标记处理不等于

如果你想尽量贴近原来的调用习惯,可以在函数内部做逻辑判断,用带前缀的键来标识不等于条件:

def query_from_DB(obj, **filter):
    DBSession = sessionmaker(bind=engine)
    session = DBSession()
    query = session.query(obj)
    
    for key, value in filter.items():
        if key.startswith('not_'):
            # 去掉前缀,获取实际字段名
            real_column = key[4:]
            # 映射到模型对应的字段
            column = getattr(obj, real_column)
            query = query.filter(column != value)
        else:
            query = query.filter_by(**{key: value})
    
    session.close()
    return [x for x in query]

调用时用not_前缀标记需要不等于的字段:

query_from_DB(Router, not_sp_id="sp-10.1.10.149", connectivity="NO")

这种方式改动小,适合只需要简单不等于查询的场景,但扩展性不如方案一。

内容的提问来源于stack exchange,提问作者vidyadhar reddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:00:15